关于mysql:MySQL索引下推原来这么简单

37次阅读

共计 1154 个字符,预计需要花费 3 分钟才能阅读完成。

大家好,我是大彬~

明天给大家分享 MySQL 的索引下推。

什么是索引下推

索引条件下推,也叫索引下推,英文全称Index Condition Pushdown,简称 ICP。

索引下推是 MySQL5.6 新增加的个性,用于优化数据的查问。

在 MySQL5.6 之前,通过应用非主键索引进行查问的时候,存储引擎通过索引查问数据,而后将后果返回给 MySQL server 层,在 server 层判断是否符合条件

在 MySQL5.6 及以上版本,能够应用索引下推的个性。当存在索引的列做为判断条件时,MySQL server 将这一部分判断条件传递给存储引擎,而后存储引擎会筛选出 合乎 MySQL server 传递条件的索引项 ,即在存储引擎层依据索引条件 过滤 掉不符合条件的索引项,而后回表查问失去后果,将后果返回给 MySQL server。

能够看到,有了索引下推的优化,在满足肯定的条件下,存储引擎层会在回表查问之前对数据进行过滤,能够缩小存储引擎回表查问的次数

举个例子

假如有一张用户信息表 user_info,有三个字段name, level, weapon(配备),建设联结索引(name, level),user_info 表初始数据如下:

id name level weapon
1 大彬 1 键盘
2 盖聂 2 渊虹
3 卫庄 3 鲨齿
4 大铁锤 4 铁锤

如果须要匹配姓名第一个字为 ” 大 ”,并且 level 为 1 的用户,SQL 语句如下:

SELECT * FROM user_info WHERE name LIKE "大 %" AND level = 1;

那么这条 SQL 具体会怎么执行呢?

上面分状况进行剖析。

先来看看 MySQL5.6 以前的版本

后面提到 MySQL5.6 以前的版本没有索引下推,其执行过程如下:

查问条件 name LIKE 不是等值匹配,依据 最左匹配准则 ,在(name, level) 索引树上只用到 name 去匹配,查找到两条记录(id 为 1 和 4),拿到这两条记录的 id 别离回表查问,而后将后果返回给 MySQL server,在 MySQL server 层进行 level 字段的判断。整个过程须要回表 2 次

而后看看 MySQL5.6 及以上版本的执行过程,如下图。

相比 5.6 以前的版本,多了索引下推的优化,在索引遍历过程中,对 索引中的字段 先做判断,过滤掉不符合条件的索引项,也就是判断 level 是否等于 1 ,level 不为 1 则间接跳过。因而在 (name, level) 索引树只匹配一个记录,之后拿着此记录对应的 id(id=1)回表查问全副数据,整个过程回表 1 次

能够应用 explain 查看是否应用索引下推,当 Extra 列的值为Using index condition,则示意应用了索引下推。

总结

从下面的例子能够看出,应用索引下推在某些场景下能够无效 缩小回表次数,从而进步查问效率。

码字不易,如果感觉对你有帮忙,能够 点个赞 激励一下!

正文完
 0