where 条件加锁分析
本文前提
- 基于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的影响