where 條件加鎖分析

 

本文前提

where提取

Index key

Index Filter

Table Filter

有什麼用?

參考文章

 

本文前提

  • 基於InnoDB存儲引擎
  • 當前讀

 

 

where提取

提取爲三部分:Index Key, Index Filter, Table Filter

Index key

Index First Key:

用於確定索引查詢的起始範圍。提取規則:從索引的第一個鍵值開始,檢查其在where條件中是否存在,若存在並且條件是=、>=,則將對應的條件加入Index First Key之中,繼續讀取索引的下一個鍵值,使用同樣的提取規則;若存在並且條件是>,則將對應的條件加入Index First Key中,同時終止Index First Key的提取;若不存在,同樣終止Index First Key的提取。

總結爲一句話:從前面往後找,如果條件是>=或者是=,則繼續,如果不是則結束(>則加入結束)

 

Index Last Key:

Index Last Key的功能與Index First Key正好相反,用於確定索引查詢的終止範圍。提取規則:從索引的第一個鍵值開始,檢查其在where條件中是否存在,若存在並且條件是=、<=,則將對應條件加入到Index Last Key中,繼續提取索引的下一個鍵值,使用同樣的提取規則;若存在並且條件是 < ,則將條件加入到Index Last Key中,同時終止提取;若不存在,同樣終止Index Last Key的提取。

總結爲一句話:從前面往後找,如果條件是<=或者是=,則繼續,如果不是則結束(<則加入結束)

 

Index Filter

就是找出能在索引記錄上過濾的條件

 

Table Filter

需要回表過濾的條件

 

什麼是ICP?

MySQL 5.6中引入的Index Condition Pushdown,究竟是將什麼Push Down到索引層面進行過濾呢?對了,答案是Index Filter。在MySQL 5.6之前,並不區分Index Filter與Table Filter,統統將Index First Key與Index Last Key範圍內的索引記錄,回表讀取完整記錄,然後返回給MySQL Server層進行過濾。而在MySQL 5.6之後,Index Filter與Table Filter分離,Index Filter下降到InnoDB的索引層面進行過濾,減少了回表與返回MySQL Server層的記錄交互開銷,提高了SQL的執行效率。

 

我們知道 rr隔離級別在給記錄加gap lock的時候,如果沒有icp的話,我們需要把這條記錄返回,那麼需要給這個記錄加next key lock。增加了鎖的範圍

 

有什麼用?

  • 對於聯合索引,我們可以判斷索引是否起到了作用。用到了聯合索引裏面的哪幾個key,
  • 對於Index Condition Pushdown技術是能夠影響到 rr隔離級別下鎖的範圍的。

 

 

 

參考文章

https://sanyuesha.com/2018/05/18/sql-where-parse/ 結合https://wenku.baidu.com/view/e332241202020740be1e9b21.html

http://blog.sae.sina.com.cn/archives/2127 講了索引如何加鎖以及icp對gap lock的影響

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章