暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL中where条件的提取

毫末之木 2021-01-13
1033

一条SQL在数据库中是如何执行的?是 个冗长而复杂的过程,而一条sql中where条件的提取可以相对的归纳出几个步骤。

SQL中where条件的提取简单归纳为三步:

  • index Key - first key/last key-确定索引结构中查询范围

  • index Filter - 确定索引中的过滤条件(过滤不符合条件的项)

  • table Filter - 回表提取表中的过滤条件(即不属于索引的查询条件)

详解:

Index First  Key - 索引中确定起始节点,仅仅⽤来定位索引的起始范围,因此只在索引第⼀次Search Path(沿着索引B+树的根节点⼀直遍历,到索引正确的叶节点位置)时使⽤,⼀次判断即可;

Index Last Key-确定结束节点,⽤来定位索引的终⽌范围,因此对于起始范围之后读到的每⼀条索引记录,均需要判断是否已经超过了Index Last Key的范围,若超过,则当前查询结束;

Index Filter-过滤不符合条件的节点,⽤于过滤索引查询范围中不满⾜查询条件的记录,因此对于索引范围中的每⼀条记录,均需要与Index Filter进⾏对⽐,若不满⾜Index Filter则直接丢弃,继续读取索引下⼀条记录;

Table Filter-表记录过滤(条件不再索引中),则是最后⼀道where条件的防线,⽤于过滤通过前⾯索引的层层考验的记录,此时的记录已经满⾜了Index First Key与Index Last Key构成的范围,并且满⾜Index Filter的条件,回表读取了完整的记录,判断完整记录是否满⾜Table Filter中的查询条件,同样的,若不满⾜,跳过当前记录,继续读取索引的下⼀条记录,若满⾜,则返回记录,此记录满⾜了where的所有条件,可以返回给前端⽤户。

ICP原理详解:在5.6之前,mysql不区分Index filter和table filter,而是将index first key和index last key区间的记录,统一回表读取完整记录,返回给mysql server层来整体过滤。而5.6之后,推出ICP优化,是在index first key和index last key区间的索引记录,进行index filter和table filter的拆分,使得index filter在索引层面过滤,减少回表和返回mysql server层的开销,来提升查询效率。所以ICP的全称是:Index Condition PushDown-符合索引条件的下推,即真正下推的是将符合在索引中进行过滤的条件放在索引中过滤。


文章转载自毫末之木,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论