普通索引和唯一索引
阿新 • • 發佈:2022-04-14
面試的時候被問到這個?當時不會。現在總結一下
普通索引和唯一索引
選擇普通索引還是唯一索引,需要從查詢和更新兩方面考慮。
1. 查詢操作
索引上的查詢,是從根結點開始,按層搜尋到葉子節點,即所謂的資料頁,然後在資料頁內部使用二分法定位記錄。
- 對於普通索引,先查詢到滿足條件的第一個記錄,然後查詢下一個記錄,直到不滿足條件。
- 對於唯一索引,只要查詢到滿足條件的第一個記錄,就會停止繼續檢索。
InnoDB
資料是以頁為單位從磁碟讀寫,資料頁預設16k
。
對於普通索引,多做的一次查詢和判斷下一條記錄操作,往往是在記憶體中進行。一次定址和一次計算的消耗很小。
可以認為,普通索引和唯一索引的查詢操作,效能差異可以忽略。
2. 更新操作
change buffer
更新一個數據時,如果資料在記憶體中就直接更新。
如果不在記憶體中,就會將更新操作快取在change buffer
。查詢操作訪問該資料頁時,會將資料頁讀入記憶體,然後對change buffer
進行merge
。
發生merge
的時刻:
- 訪問資料頁
- 後臺定期
merge
- 資料庫正常關閉時
merge
過程:
- 從磁碟讀取資料頁
- 應用該資料頁的
change buffer
記錄,得到新版資料頁 - 寫
redo log
,包含了change buffer
的變更和資料的變更
優點:
- 減少讀磁碟
- 資料讀入記憶體會佔用
buffer pool
,所以可避免佔用buffer pool
插入新行
如果記錄在記憶體中
對於唯一索引來說,需要判斷唯一性衝突;對於普通索引來說,可以直接插入。多一個判斷對效能基本沒影響。
如果記錄不在記憶體中
對於唯一索引來說,需要將資料頁讀入記憶體,從而判斷唯一性。
對於普通索引來說,將更新記錄記在change buffer
中即可。