在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如果你在面试中,听到MySQL5.6”、“索引优化” 之类的词语,你就要立马get到,这个问的是“索引下推”。 什么是索引下推索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。 索引下推优化的原理我们先简单了解一下MySQL大概的架构: MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。 索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。 我们来具体看一下,在没有使用ICP的情况下,MySQL的查询:
使用ICP的情况下,查询过程:
索引下推的具体实践理论比较抽象,我们来上一个实践。 使用一张用户表tuser,表里创建联合索引(name, age)。 如果现在有一个需求:检索出表中名字第一个字是张,而且年龄是10岁的所有用户。那么,SQL语句是这么写的: select * from tuser where name like '张%' and age=10; 假如你了解索引最左匹配原则,那么就知道这个语句在搜索索引树的时候,只能用 张,找到的第一个满足条件的记录id为1。 那接下来的步骤是什么呢? 没有使用ICP在MySQL 5.6之前,存储引擎根据通过联合索引找到 我们看一下示意图: 可以看到需要回表两次,把我们联合索引的另一个字段age浪费了。 使用ICP而MySQL 5.6 以后, 存储引擎根据(name,age)联合索引,找到 我们看一下示意图: 可以看到只回表了一次。 除此之外我们还可以看一下执行计划,看到 +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | tuser | NULL | range | na_index | na_index | 102 | NULL | 2 | 25.00 | Using index condition | +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+ 索引下推使用条件
索引下推的目的是为了减少回表次数,也就是要减少IO操作。对于InnoDB的聚簇索引来说,数据和索引是在一起的,不存在回表这一说。
相关系统参数索引条件下推默认是开启的,可以使用系统参数optimizer_switch来控制器是否开启。 查看默认状态: mysql> select @@optimizer_switch\G; *************************** 1. row *************************** @@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on 1 row in set (0.00 sec) 切换状态: set optimizer_switch="index_condition_pushdown=off"; set optimizer_switch="index_condition_pushdown=on"; 总结本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注极客世界的更多内容! |
请发表评论