5

#yyds干货盘点# 图解MySQL索引下推

 2 years ago
source link: https://blog.51cto.com/u_13401476/5071330
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是大彬~
今天给大家分享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表初始数据如下:

level

weapon

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

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

那么这条SQL具体会怎么执行呢?
下面分情况进行分析。

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

#yyds干货盘点# 图解MySQL索引下推_存储引擎

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

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

#yyds干货盘点# 图解MySQL索引下推_存储引擎_02

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

可以使用explain查看是否使用索引下推,当​​Extra​​列的值为​​Using index condition​​,则表示使用了索引下推。

从上面的例子可以看出,使用索引下推在某些场景下可以有效减少回表次数,从而提高查询效率。

码字不易,如果觉得对你有帮助,可以点个赞鼓励一下!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK