1. 程式人生 > 其它 >普通索引和唯一索引

普通索引和唯一索引

面試的時候被問到這個?當時不會。現在總結一下

普通索引和唯一索引

選擇普通索引還是唯一索引,需要從查詢和更新兩方面考慮。

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中即可。