Mysql名詞解析-主鍵索引/回表/索引覆蓋/索引下推/MVCC
阿新 • • 發佈:2022-04-09
主鍵索引和非主鍵索引
主鍵索引的葉子節點存的是整行資料。在 InnoDB 裡,主鍵索引也被稱為聚簇索引
非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 裡,非主鍵索引也被稱為二級索引
回表
普通索引查詢方式,則需要先搜尋其索引樹,得到主鍵索引的值為,再到主鍵索引樹搜尋一次。這個過程稱為回表。
索引覆蓋
只需要在一棵索引樹上就能獲取SQL所需的所有列資料,無需回表,速度更快。
(即explain的輸出結果Extra欄位為Using index時,能夠觸發索引覆蓋)
索引下推 (Index Condition Pushdown),簡稱ICP
索引下推的下推其實就是指將部分上層(服務層)負責的事情,交給了下層(引擎層)去處理。
使用ICP,當存在索引的列做為判斷條件時,儲存引擎通過判斷索引是否符合MySQL伺服器傳遞的條件,只有當索引符合條件時才會將資料檢索出來返回給MySQL伺服器。
不使用ICP,通過使用非主鍵索引進行查詢,儲存引擎通過索引檢索資料,然後返回給MySQL伺服器,伺服器再判斷是否符合條件。
MVCC
MySQL InnoDB儲存引擎,實現的是基於多版本的併發控制協議——MVCC (Multi-Version Concurrency Control) 。
MVCC最大的好處:讀不加鎖,讀寫不衝突。
LBCC:Lock-Based Concurrency Control,基於鎖的併發控制。基於鎖的併發機制併發量低,MVCC是在基於鎖的併發控制上的改進。
在MVCC併發控制中,讀操作可以分成兩類:
- 快照讀:讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖(共享讀鎖s鎖也不加,所以不會阻塞其他事務的寫)
- 當前讀 :讀取的是記錄的最新版本,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄