MySQL 唯一索引和普通索引

廖子博發表於2024-10-15

唯一索引和普通索引的區別

查詢過程

基本沒有區別

select id from T where k = 5

InnoDB 資料的讀寫單位是資料頁,預設是 16KB。

更新過程

普通索引可以使用 change buffer(會持久化),唯一索引不行。

當需要更新一個資料頁是,如果資料頁在記憶體中就直接更新,
如果資料頁還沒在記憶體中,在不影響一致性的前提下,InnoDB 會將更新快取在 change buffer 中,這樣就不需要從磁碟讀取資料頁了。

除了訪問資料頁會觸發 merge 外,系統後臺執行緒會定期 merge,資料庫正常關閉也會執行 merge。(merge 時同資料頁更新越頻繁,收益越大)

change buffer 用的是 buffer pool 的記憶體,可以透過引數 innodb_change_buffer_max_size 動態陣列 change buffer 佔用百分比。

change buffer 適用場景

  • 寫多讀少,change buffer 不適合資料更新後立即被訪問的場景(多了 merge 的代價)
  • 資料頁被更新越頻繁,收益越大

索引選擇實踐

  • 對於一般場景,應該優先選擇唯一索引,以保證資料準確性
  • 對於頻繁更新/插入場景,可以選擇普通索引,透過 change buffer 提升效能
  • 對於頻繁更新後立即查詢的場景,可以選擇關閉 change buffer
  • 對於歸檔資料,因為已經保證資料準確性,所以可以選擇普通索引

相關文章