唯一索引和普通索引的區別
查詢過程
基本沒有區別
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
- 對於歸檔資料,因為已經保證資料準確性,所以可以選擇普通索引