绵阳网站改版,北京工商局网站如何做股东变更,淘宝客 网站备案,简历模板免费下载wps可编辑文章目录 什么是索引下推索引下推优化的原理索引下推的具体实践没有使用ICP使用ICP 总结索引下推使用条件相关系统参数 什么是索引下推
索引下推(Index Condition Pushdown#xff0c;简称ICP)#xff0c;是MySQL5.6版本的新特性#xff0c;它能减少回表查询次数#xff0… 文章目录 什么是索引下推索引下推优化的原理索引下推的具体实践没有使用ICP使用ICP 总结索引下推使用条件相关系统参数 什么是索引下推
索引下推(Index Condition Pushdown简称ICP)是MySQL5.6版本的新特性它能减少回表查询次数提高查询效率。
索引下推优化的原理
我们先简单了解一下MySQL大概的架构 MySQL服务层负责SQL语法解析、生成执行计划等并调用存储引擎层去执行数据的存储和检索。
索引下推的下推其实就是指将部分上层服务层负责的事情交给了下层引擎层去处理。
我们来具体看一下在没有使用ICP的情况下MySQL的查询
存储引擎读取索引记录根据索引中的索引值定位并读取完整的行记录存储引擎把记录交给Server层去检测该记录是否满足WHERE条件不满足就过滤掉。
使用ICP的情况下查询过程
存储引擎读取索引记录不是完整的行记录判断WHERE条件部分能否用索引中的列来做检查条件不满足则处理下一行索引记录条件满足使用索引中的主键去定位并读取完整的行记录就是所谓的回表存储引擎把记录交给Server层Server层检测该记录是否满足WHERE条件的其余部分。
索引下推的具体实践
使用一张用户表tuser表里创建联合索引name, age。 如果现在有一个需求检索出表中名字第一个字是张而且年龄是10岁的所有用户。那么SQL语句是这么写的 select * from tuser where name like 张% and age10;
根据最左匹配原则匹配到like之后就停止往后继续匹配所以这个语句在搜索索引树的时候只能用 张找到的第一个满足条件的记录id为1。 那接下来的步骤是什么呢
没有使用ICP
在MySQL 5.6之前存储引擎根据通过联合索引找到name like ‘张%’ 的主键id1、4逐一进行回表扫描去聚簇索引找到完整的行记录server层再对数据根据age10进行筛选。
我们看一下示意图 可以看到需要回表两次把我们联合索引的另一个字段age浪费了。
使用ICP
而MySQL 5.6 以后 存储引擎根据nameage联合索引找到name like ‘张%’由于联合索引中包含age列所以存储引擎直接再联合索引里按照age10过滤。按照过滤后的数据再一一进行回表扫描。
我们看一下示意图 可以看到只回表了一次。
除此之外我们还可以看一下执行计划看到Extra一列里 Using index condition这就是用到了索引下推。
--------------------------------------------------------------------------------------------------------------------------
| 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 |
--------------------------------------------------------------------------------------------------------------------------总结
上例说明组合索引中没被利用的索引列在存储引擎层过滤而不需要返回服务层过滤从而减少回表次数。
索引下推使用条件
只能用于range、 ref、 eq_ref、ref_or_null访问方法只能用于InnoDB和 MyISAM存储引擎及其分区表对InnoDB存储引擎来说索引下推只适用于二级索引也叫辅助索引; 索引下推的目的是为了减少回表次数也就是要减少IO操作。对于InnoDB的聚簇索引来说数据和索引是在一起的不存在回表这一说。 引用了子查询的条件不能下推引用了存储函数的条件不能下推因为存储引擎无法调用存储函数。
相关系统参数
索引条件下推默认是开启的可以使用系统参数optimizer_switch来控制器是否开启。
查看默认状态
mysql select optimizer_switch\G;
*************************** 1. row ***************************
optimizer_switch: index_mergeon,index_merge_unionon,index_merge_sort_unionon,index_merge_intersectionon,engine_condition_pushdownon,index_condition_pushdownon,mrron,mrr_cost_basedon,block_nested_loopon,batched_key_accessoff,materializationon,semijoinon,loosescanon,firstmatchon,duplicateweedouton,subquery_materialization_cost_basedon,use_index_extensionson,condition_fanout_filteron,derived_mergeon
1 row in set (0.00 sec)切换状态
set optimizer_switchindex_condition_pushdownoff;
set optimizer_switchindex_condition_pushdownon;