MySql面試題總結

2021-10-07 14:08:09 字數 4000 閱讀 7426

mysql主要考察方向

· 基本sql的編寫能力

· 資料庫鎖和索引的原理

· 事務

1.資料庫的三正規化是什麼?

第一正規化:表中的列只能含有原子性(每個屬性不可再分)的值。

每一列都是單獨的屬性,不可再分,但是存在資料冗餘大,插入異常,刪除異常,修改異常的問題。

冗餘大:對應的屬性都一樣,在表中一直在重複這個屬性值

插入異常:想單獨建立若干個與主鍵無關的屬性集,但是因為必須輸入主鍵所以插入異常

刪除異常:刪除主鍵後,對應的屬性資料也刪除了

修改異常:如果修改其中乙個屬性,為保持一致性,也要連同修改其他幾個屬性

第二正規化:在1nf基礎上,消除了非主屬性對於碼的部分函式依賴

完全函式依賴是非主屬性值需要依賴主屬性的全部屬性確認

部份依賴只需要主屬性中一部分屬性確認

傳遞函式依賴:a – >b , b – >c 如果通過a屬性(屬性組)的值,可以確定唯一的b屬性的值,再通過b屬性(屬性組)的值,可以唯一確定c屬性的值,那麼稱c傳遞依賴於a

第三正規化(3nf):在2nf的基礎上,任何的非主屬性不依賴於其他非主屬性 (在第二正規化基礎上消除傳遞依賴)

2.一張自增表裡面總共有 7 條資料,刪除了最後 2 條資料,重啟 mysql 資料庫,又插入了一條資料,此時 id 是幾?

innodb只把自增主鍵最大id記錄到記憶體中,重啟後插入id為6

而myisam記錄是8,因為mylsam表會把自增主鍵的最大id記錄到資料檔案裡面,就算重啟,自增主鍵id也不會消失

3.如何獲取當前資料庫版本?

4.說一下 acid 是什麼?

原子性(atomicity):事務是乙個不可分割的單位,事務的操作要麼都完成要麼都不完成

一致性(consistency):事務前後的資料的完整性必須保持一致

隔離性(isolation):事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。

髒讀:乙個事務處理過程中讀取了另乙個事務中未提交的資料。是讀取了另乙個事務的資料

不可重複讀:指在對於資料庫中的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值。例如事務t1在讀取某一資料,而事務t2立馬修改了這個資料並且提交事務給資料庫,事務t1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。讀取了前乙個事務的資料

虛讀(幻讀):事務t1修改一定範圍資料,事務t2增加一條資料,而t1修改後t2新加的資料並未修改

四種隔離級別設定

設定描述

serializable(序列化)

可避免髒讀、不可重複讀、虛讀情況的發生。

repeatable read(可重複讀)

可避免髒讀、不可重複讀情況的發生。

read committed(讀已提交)

可避免髒讀情況發生。

read uncommitted(讀未提交)

最低級別,以上情況均無法保證。

永續性(durability):乙個事務一旦被提交,對資料庫中資料的改變是永久性的,即使資料庫發生故障也不會有影響。

5.char 和 varchar 的區別是什麼?

char是固定長度,而varchar是非固定長度可變換。char的查詢速度快於varchar,因為長度固定,方便儲存和查詢,用空間換時間,而varchar是以空間為首位

6.float 和 double 的區別是什麼?

float單精度浮點 4位元組、double雙精度浮點8位元組

float -2128~2128 double -21024~21024

小數預設為double型別,float要加f字尾

7.mysql 的內連線、左連線、右連線有什麼區別?

內連線:獲取兩個表中字段匹配關係的記錄

右連線:獲取右表所有記錄,即使左表沒有對應匹配的記錄

全外連線:(左右2張表都不加限制)

8.mysql 索引是怎麼實現的?

使用b+樹作為索引結構,希望查詢效率高並且不占用太多空間,因為雖然儲存在記憶體的磁碟訪問速度很快,但是當表的數量增加,記憶體不足以放下索引,則需要儲存在硬碟中,用時間換空間,這時候用二叉查詢樹效率就低很多(深度深),樹的高度等於查詢資料時磁碟io操作次數,所以使用b+樹(m叉樹),使得樹更加扁平,m 值是根據頁面的大小事先計算好的。通過雙向鍊錶(支援前後遍歷)將葉子節點串聯在一起,這樣可以方便的按區間查詢,用磁碟多占用一倍指標空間微不足道,時間提公升;b+樹的葉子節點儲存的是索引。

9.怎麼驗證 mysql 的索引是否滿足需求?

使用 explain 檢視 sql 是如何執行查詢語句的,從而分析你的索引是否滿足需求。 explain 語法:

explain select * from table where type=1。

10.說一下資料庫的事務隔離?

資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性,可能出現問題為臟讀、不可重複讀、幻讀,都是資料庫讀一致性問題,必須由事務提供隔離機制來解決。事務隔離越嚴格,併發***小,但是效率變慢。避免不可重複讀需要鎖行(某一行在select操作時,不允許update與delete)就行,避免幻讀則需要鎖表。mysql資料庫所預設的級別為可重複讀

11.說一下 mysql 常用的引擎?

常用的引擎主要就是2個:innodb和myiasm

\1. innodb 支援事務,myisam 不支援事務。myisam是非事務安全的,而innodb是事務安全的

\2. myisam相對簡單,效率上要優於innodb,小型應用可以考慮使用myisam

\3. 索引使用的都是b+樹(葉子節點只儲存資料檔案指標),叫非聚集索引,不過innodb也是用b+樹,不過資料結構中儲存的都是資料。

\4. innodb 不儲存表的具體行數,執行 select count(*) from table 時需要全表掃瞄。而myisam 用乙個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;myisam支援全文型別索引,而innodb不支援全文索引

\5. innodb 最小的鎖粒度是行鎖,myisam 最小的鎖粒度是表鎖。innodb更適合高併發場景、事務處理,但是小型應用用myisam,效率更高。innodb使用索引作為檢索條件修改資料時採用行鎖,否則採用表鎖

12.說一下 mysql 的行鎖和表鎖?

表鎖雖然開銷小,鎖表快,但高併發下效能低。

行鎖雖然開銷大,鎖表慢,但高併發下相比之下效能更高。

事務和行鎖都是在確保資料準確的基礎上提高併發的處理能力。

共享鎖(讀鎖):多用於判斷資料是否存在,多個讀操作可以同時進行而不會互相影響。使資料可讀不可寫。

排他鎖(寫鎖):當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。使資料不可讀不可寫

13.說一下樂觀鎖和悲觀鎖?

讀得多,衝突少,樂觀鎖

樂觀鎖實現方法:版本號機制、cas演算法

版本號機制:每次修改資料前,讀version號,提交更新時比對剛剛讀取的值,若相同則更新成功,不同則回滾事務。

cas演算法(compare and swap(比較與交換)):出名的**無鎖演算法,**拿副本中的預期值與主存中的值作比較,如果相等就繼續替換新值,如果不相等就說明主存中的值已經被別的執行緒修改,就繼續重試;

寫得多,衝突多,悲觀鎖:給資料庫加鎖

14.mysql 問題排查都有哪些手段?

以後再說

15.如何做 mysql 的效能優化?

1、建立合適的索引

說明主存中的值已經被別的執行緒修改,就繼續重試;

寫得多,衝突多,悲觀鎖:給資料庫加鎖

[外鏈轉存中…(img-o5gaz72y-1593339628955)]

14.mysql 問題排查都有哪些手段?

以後再說

15.如何做 mysql 的效能優化?

1、建立合適的索引

2、開啟慢查詢日誌,記錄執行速度慢的sql語句,優化sql語句

面試題總結 五 mysql

關於二者的對比與總結 1.count運算上的區別 因為myisam快取有表meta data 行數等 因此在做count 時對於乙個結構很好 的查詢是不需要消耗多少資源的。而對於innodb來說,則沒有這種快取。2.是否支援事務和崩潰後的安全恢復 myisam 強調的是效能,每次查詢具有原子性,其執...

MySQL面試題總結 一

1 索引概念 簡單來說索引是乙個幫助我們快速查詢資料的資料結構。對於mysql資料庫來說,索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃瞄全表來定位某行的資料,而是先通過索引表找到該行...

面試題總結 html面試題)

附上鏈結 doctype 的作用是什麼?宣告一般位於文件的第一行,它的作用主要是告訴瀏覽器以什麼樣的模式來解析文件。一般指定了之後會以標準模式來 進行文件解析,否則就以相容模式進行解析。在標準模式下,瀏覽器的解析規則都是按照最新的標準進行解析的。而在相容模式下,瀏 覽器會以向後相容的方式來模擬老式瀏...