ICP(index condition pushdown)是mysql利用索引(二级索引)元组和筛字段在索引中的where条件从表中提取数据记录的一种优化操作。ICP的思想是:存储引擎在访问索引的时候检查筛选字段在索引中的where条件(pushed index condition,推送的索引条件),如果索引元组中的数据不满足推送的索引条件,那么就过滤掉该条数据记录。ICP(优化器)尽可能的把index condition的处理从server层下推到storage engine(存储引擎层)层。storage engine(存储引擎层)使用索引过过滤不相关的数据,仅返回符合index condition条件的数据给server层。也是说数据过滤尽可能在storage engine层进行,而不是返回所有数据给server层,然后后再根据where条件进行过滤。使用ICP(mysql 5.6版本以前)和没有使用ICP的数据访问和提取过程如下(插图来在MariaDB Blog)

优化器没有使用ICP时,数据访问和提取的过程如下(图1):
1) 当storage engine读取下一行时,首先读取索引元组(index tuple),然后使用索引元组在基表中(base table)定位和读取整行数据。

2) sever层评估where条件,如果该行数据满足where条件则使用,否则丢弃。

3) 执行1),直到最后一行数据。

优化器使用ICP时,server层将会把能够通过使用索引进行评估的where条件下推到storage engine层。数据访问和提取过程如下(图2):

  1. storage engine从索引中读取下一条索引元组。

  2. storage engine使用索引元组评估下推的索引条件。如果没有满足wehere条件,storage engine将会处理下一条索引元组(回到上一步)。只有当索引元组满足下推的索引条件的时候,才会继续去基表中读取数据。

  3. 如果满足下推的索引条件,storage engine通过索引元组定位基表的行和读取整行数据并返回给server层。

  4. server层评估没有被下推到storage engine层的where条件,如果该行数据满足where条件则使用,否则丢弃。

而使用ICP时,如果where条件的一部分能够通过使用索引中的字段进行评估,那么mysql server把这部分where条件下推到storage engine(存储引擎层)。存储引擎通过索引元组的索引列数据过滤不满足下推索引条件的数据行。

索引条件下推的意思就是筛选字段在索引中的where条件从server层下推到storage engine(存储引擎层)层,这样可以在存储引擎层过滤数据。由此可见,ICP可以减少存储引擎访问基表的次数和mysql server访问存储引擎的次数。

注意一下ICP的使用条件:

  • 只能用于二级索引(secondary index)。

  • explain显示的执行计划中type值(join 类型)为range、 ref、 eq_ref或者ref_or_null。且查询需要访问表的整行数据,即不能直接通过二级索引的元组数据获得查询结果(如果是这样就是索引覆盖)。

  • ICP可以用于MyISAM和InnnoDB存储引擎,不支持分区表(5.7将会解决这个问题)。

ICP的开启优化功能与关闭

MySQL5.6可以通过设置optimizer_switch([global|session],dynamic)变量开启或者关闭index_condition_push优化功能,默认开启。
mysql > set optimizer_switch=’index_condition_pushdown=on|off’
用explain查看执行计划时,如果执行计划中的Extra信息为“using index condition”,表示优化器使用的index condition pushdown。
在mysql5.6以前,还没有采用ICP这种查询优化,where查询条件中的索引条件在某些情况下没有充分利用索引过滤数据。假设一个组合索引(多列索引)K包含(c1,c2,…,cn)n个列,如果在c1上存在范围扫描的where条件,那么剩余的c2,…,cn这n-1个上索引都无法用来提取和过滤数据(不管不管是唯一查找还是范围查找),索引记录没有被充分利用。即组合索引前面字段上存在范围查询,那么后面的部分的索引将不能被使用,因为后面部分的索引数据是无序。比如,索引key(a,b)中的元组数据为(0,100)、(1,50)、(1,100) ,where查询条件为 a < 2 and b = 100。由于b上得索引数据并不是连续区间,因为在读取(1,50)之后不再会读取(1,100),mysql优化器在执行索引区间扫描之后也不再扫描组合索引其后面的部分。

表结构定义如下:

CREATE TABLE `person` (
`person_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`postadlcode` int(11) DEFAULT NULL,
`age` tinyint(4) DEFAULT NULL,
`first_name` varchar(45) NOT NULL,
`last_name` varchar(45) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`person_id`),
KEY `idx_p_a` (`postadlcode`,`age`),
KEY `idx_f_l` (`first_name`,`last_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

1、关闭ICP优化,Extra信息为“Using Where”

mysql> set optimizer_switch = "index_condition_pushdown=off";
mysql> explain select  *   from person  where postadlcode between 300000 and 400000 and age > 40;
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | person | range | idx_p_a       | idx_p_a | 7       | NULL |   21 | Using where |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+

2、开启ICP之后,Extra信息为“Using Index Condition”

mysql> set optimizer_switch = "index_condition_pushdown=on";
mysql> explain select  *   from person  where postadlcode between 300000 and 400000 and age > 40;
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
| id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows | Extra                 |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+
|  1 | SIMPLE      | person | range | idx_p_a       | idx_p_a | 7       | NULL |   21 | Using index condition |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-----------------------+

若有侵权,请联系博主,立即删除
转载:DBA的罗浮宫

MySQL5.6之Index Condition Pushdown(ICP,索引条件下推)相关推荐

  1. icp mysql_MySQL · 特性分析 · Index Condition Pushdown (ICP)

    前言 上一篇文章 提过,我们在之后的文章中会从 optimizer 的选项出发,系统的介绍 optimizer 的各个变量,包括变量的原理.作用以及源码实现等,然后再进一步的介绍优化器的工作过程(SQ ...

  2. 神奇的 SQL 之 ICP → 索引条件下推

    作者:青石路 cnblogs.com/youzhibing/p/12318565.html 回表与覆盖索引 正式讲 ICP 之前了,我们先将相关的概念捋一捋,知道的就当回顾,不知道的就当了解了,这有助 ...

  3. MySQL中Index Condition Pushdown(ICP)优化

    在MySQL 5.6开始支持的一种根据索引进行查询的优化方式.之前的MySQL数据库版本不支持ICP,当进行索引查询是,首先根据索引来查找记录,然后在根据WHERE条件来过滤记录.在支持ICP后,My ...

  4. mysql 索引条件推送_MySQL 处理where条件 index condition pushdown索引条件下推

    5.6之后,MySQL的优化技术 在使用二级索引过滤where条件时,减少回表的次数 以及 MySQL server层和引擎层交互的次数 1.数据库如何处理where条件 index key(inde ...

  5. 【mysql优化 2】索引条件下推优化

    原文地址:Index Condition Pushdown Optimization 索引条件下推(ICP:index condition pushdown)是mysql中一个常用的优化,尤其是当my ...

  6. 【MySQL】MySQL5.6新特性之Index Condition Pushdown

    一 概念介绍     Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. a 当关闭ICP时,inde ...

  7. MySQL Index Condition Pushdown 原理与解析

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法. 原理: 在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysql ...

  8. Index Condition Pushdown Optimization

    Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a tab ...

  9. 【MySQL】性能优化之 Index Condition Pushdown

    一 概念介绍     Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. a 当关闭ICP时,inde ...

最新文章

  1. 批阅论文和作业Python程序助手
  2. 再见面试官:你能说说 Spring 框架中 Bean 的生命周期吗?
  3. SQL Azure Reporting CTP
  4. 西电计算机科学院实践中心,计算机基础教学实验中心
  5. android cardview控件,CardView控件的使用方式
  6. 服务器进bios修改启动顺序,服务器进入bios设置u盘启动
  7. jquery radio/checkbox change 事件不能触发的问题
  8. 离人计算机乐谱,离人简谱 林志炫离人挥霍着眼泪,回避还在眼前的离别
  9. 如何从列表中删除第一个项目?
  10. 2 创建型模式之 - 工厂模式
  11. SVN自动定时更新方法
  12. polar函数--Matplotlib
  13. 计算机网络基础试题2,计算机网络基础试题库2
  14. MaxScript 例子 渲染
  15. python实现K均值聚类算法
  16. HTTP请求返回415错误解决办法
  17. 噇字符集linux增加,『转』Unicode汉字编码表
  18. icinga ido2db
  19. VUE3+TS脚手架安装+目录文件规范
  20. iOS UITextView 光标位置

热门文章

  1. 掌握spec只需读这一篇文章,CentOS、RedHat、SUSE粉的福利来了
  2. jsp jquery ajax请求,JSP+jquery使用ajax方式调用json的实现方法
  3. python判断端口是否开放_Python扫描IP段查看指定端口是否开放的方法
  4. k8s创建Deployment报错:missing required field “selector“ in io.k8s.api.apps.v1.DeploymentSpec
  5. 前向传播、反向传播——通俗易懂
  6. 4-1 AlexNet神经网络
  7. 09 | 自编码器:让模型拥有属于自己的表达和语言
  8. 蓝牙扫描_无线扫描枪常见的传输模式及其区别
  9. 前端捕捉轨迹_基于JavaScript实现每日签到打卡轨迹功能
  10. python编程狮电脑版_w3cschool编程狮PC版-编程狮电脑版下载 v3.3.10--PC6电脑版