2019独角兽企业重金招聘Python工程师标准>>>

一、Index Condition Pushdown简介

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开启和关闭时数据访问和提取过程对比

优化器没有使用ICP时,数据访问和提取的过程如下:

1):MySQL Server发出读取数据的命令,这是在执行器中执行如下代码段,通过函数指针和handle接口调用存储引擎的索引读或全表表读。此处进行的是索引读。

if (in_first_read){in_first_read= false;error= (*qep_tab->read_first_record)(qep_tab); //设定合适的读取函数,如设定索引读函数/全表扫描函数}elseerror= info->read_record(info);

2、3):进入存储引擎,读取索引树,在索引树上查找,把满足条件的(经过查找,红色的满足)从表记录中读出(步骤④,通常有IO),从存储引擎返回⑤标识的结果。此处,不仅要在索引行进行索引读取(通常是内存中,速度快。步骤③),还要进行进行步骤④,通常有IO。

6):从存储引擎返回查找到的多条元组给MySQL Server,MySQL Server在⑦得到较多的元组。

7、8):⑦到⑧依据WHERE子句条件进行过滤,得到满足条件的元组。注意在MySQL Server层得到较多元组,然后才过滤,最终得到的是少量的、符合条件的元组。

优化器使用ICP时,server层将会把能够通过使用索引进行评估的where条件下推到storage engine层。

数据访问和提取过程如下:

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

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

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

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

三、ICP测试

3.1  对比执行计划的差别

联合索引的第一个条件可以使用索引,第二个不能使用索引

root@localhost:mysql.sock  15:33:47 [test]>explain select  *   from person  where postadlcode between 300000 and 400000 and age > 40;+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+|  1 | SIMPLE      | person | NULL       | range | idx_p_a       | idx_p_a | 7       | NULL |    1 |    33.33 | Using index condition |+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+1 row in set, 1 warning (0.11 sec)

关闭ICP后

root@localhost:mysql.sock  15:35:42 [test]>set optimizer_switch = "index_condition_pushdown=off";Query OK, 0 rows affected (0.00 sec)root@localhost:mysql.sock  15:39:48 [test]>explain select  *   from person  where postadlcode between 300000 and 400000 and age > 40;+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+|  1 | SIMPLE      | person | NULL       | range | idx_p_a       | idx_p_a | 7       | NULL |    1 |    33.33 | Using where |+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)

where条件包含索引字段但用不到索引

root@localhost:mysql.sock  15:39:49 [test]>explain select  *   from person  where age > 40;+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | person | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    7 |    33.33 | Using where |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)root@localhost:mysql.sock  15:41:03 [test]>set optimizer_switch = "index_condition_pushdown=on";Query OK, 0 rows affected (0.00 sec)root@localhost:mysql.sock  15:41:09 [test]>explain select  *   from person  where age > 40;+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | person | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    7 |    33.33 | Using where |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.01 sec)

结论:

需要index condition pushdown 的query通常索引的字段出现where子句里面都是范围查询。比如:

select * from tb where tb.key_part1 < x and tb.key_part2 = y
select * from tb where tb.key_part1 = x andtb.key_part2 like '%yyyy%'
select * from tb where tb.key_part1 > x and tb.key_part1 < y and tb.key_part1 > xx and tb.key_part2 < yy

但是需要注意的是:
1. 如果索引的第一个字段的查询就是没有边界的比如 key_part1 like '%xxx%',那么不要说ICP,就连索引都会没法利用。
2.
如果select的字段全部在索引里面,那么就是直接的index scan了,没有必要什么ICP

为了方便大家交流,本人开通了微信公众号,和QQ群1(291519319)和QQ群2(659336691)。喜欢技术的一起来交流吧

转载于:https://my.oschina.net/u/3023401/blog/1535362

MySQL Index Condition Pushdown相关推荐

  1. MySQL Index Condition Pushdown 原理与解析

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

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

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

  3. MySQL 索引条件下推 Index Condition Pushdown

    MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下: 内容摘录自<深入理解MariaDB和MySQL& ...

  4. MySQL - 索引下推 Index Condition Pushdown 初探

    文章目录 生猛干货 Pre ICP 索引下推的含义 范围查找为啥不行? 搞定MySQL 生猛干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 索 ...

  5. MySQL索引与Index Condition Pushdown(二)

    实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...

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

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

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

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

  8. mysql icp(Index Condition Pushdown) using index condition

    ICP(index condition pushdown)是mysql利用索引(二级索引)元组和筛字段在索引中的where条件从表中提取数据记录的一种优化操作.ICP的思想是:存储引擎在访问索引的时候 ...

  9. mysql pushdown_MySQL 5.6 中一个重要的优化——Index Condition Pushdown,究竟push down了什么...

    1        问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语 ...

最新文章

  1. 使用YOLOv5模型进行目标检测!
  2. 基于html5制作3D拳击游戏源码下载
  3. 创建ROS消息和服务---ROS学习第8篇
  4. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  5. 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
  6. CoreJava学习第五课 --- 进入第二阶段:面向对象编程思想
  7. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
  8. centos7源码安装mysql8.0_CentOS7下源码安装MySQL 8.x
  9. Angularjs 观察者模式 理解
  10. [转载] 使用python完成冒泡排序_使用python实现-冒泡排序
  11. POJ 3311 Hie with the Pie(状压DP + Floyd)
  12. 基于javaweb+jsp的员工绩效考核管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap Ajax)
  13. 苹果计算机重装系统步骤,苹果笔记本电脑重装mac系统教程
  14. alt复制选区就会卡 ps_ps复制选区快捷键是什么
  15. 支付宝营销策略效果分析 A/Btest
  16. 等比矩阵求和-POJ3233
  17. [训练9] 创建猫类
  18. 一位开发大神的“告别信”!
  19. ADFでパラメーターのやり取り
  20. BlazeFace测试

热门文章

  1. 计算机图形学学习报告,计算机图形学学习报告.doc
  2. python history函数_python的history_n 和history函数 获取的成交量和持仓量出现翻倍
  3. oracle 对两列加唯一性束_oracle中创建unique唯一约束(单列和多列) 。
  4. html 列表点,HTML列表
  5. pdm 导入mysql 注释_PowerDesigner逆向导入MYSQL数据库并显示中文注释(转载)
  6. 计算器java程序设计报告总体设计,java程序设计实验报告-计算器
  7. Android nfc编译,【Android编译】各个模块编译方法
  8. 八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/
  9. python字典的建立和输出_字典的创建和使用
  10. 河南理工大学c语言报告封面,河南理工大学图书信息管理系统设计_纯c语言课程设计.doc...