MySQL——索引下推

1、使用前后对比

index Condition Pushdown(ICP)是MySQL5.6中新特性,是一种在存储引擎层使用索引过滤数据的优化方式。

  • 如果没有ICP,存储引擎会遍历索引以定位基表中的行,并将它们返回给MySQL服务器,由MySQL服务器评估WHERE后面的条件是否保留行。
  • 启用ICP后(默认启用),如果部分WHERE条件可以仅使用索引中的列进行筛选,则MySQL服务器会把这部分WHERE条件放到存储引擎筛选。然后,存储引擎通过使用索引条目来筛选数据,并且只有在满足这一条件时才从表中读取行。
    • 好处:ICP可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。但是,ICP的加速效果取决于在存储引擎内通过ICP筛选掉的数据的比例。

例如以下语句

EXPLAIN SELECT * FROM `s1` WHERE key1 = 'vLuQVg' and key1 like '%v'

在这里插入图片描述

其中的key1 = 'vLuQVg’可以使用到索引,但是key1 like ‘%v’ 却无法使用到索引,在以前版本中的MySQL中,是按照下边步骤来执行这个查询的:

  • 先根据key1 = 'vLuQVg’这个条件。从二级索引index_key1中获取到对应的二级索引记录。
  • 根据上一步骤得到的二次索引记录中的主键进行回表,找到完整的用户记录在检测记录是否符合**key1 like ‘%v’**这个条件,将符合条件的记录加入最后的结果集。

但是虽然key1 like ‘%v’ 不能组成范围区间参与range访问方法的执行,但这个条件毕竟只涉及到了key1列,所以MySQL把上边的步骤改进了一下:

  • 先根据key1 = 'vLuQVg’这个条件,定位到二级索引index_key1中对应的二级索引记录。
  • 对于指定的二级索引记录,先不着急回表,而是先检测一下该记录是否满足key1 like ‘%v’ 这个条件,如果这个条件不满足,则该二级索引记录压根就没必要回表操作。
  • 对于满足key1 like ‘%v’ 这个条件的二级索引记录进行回表操作。

我们说回表操作其实是一个随机IO,比较耗时,所以上述修改虽然只改进一点点,但是可以省去好多回表操作的成本。MySQL把它们的这个改进称之为索引条件下推(英文名:Index Condition Pushdown)。

2、ICP的使用条件

  1. 如果表访问的类型为range、ref、eq_ref和ref_or_null可以使用ICP
  2. ICP可以用于Innodb和MyISAM表,包括分区表Innodb和MyISAM表
  3. 对于Innodb表,ICP仅用于二级索引。ICP的目标是减少全行读取次数,从而减少I/O操作
  4. 当SQL使用覆盖索引时,不支持ICP,因为这种情况使用ICP不会减少I/O
  5. 相关子查询的条件不能使用ICP

相关推荐

  1. Mysql——索引

    2024-06-05 19:35:25       37 阅读
  2. MySQL索引

    2024-06-05 19:35:25       36 阅读
  3. mysql默认开启索引,减少回表的数据

    2024-06-05 19:35:25       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:35:25       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:35:25       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:35:25       87 阅读
  4. Python语言-面向对象

    2024-06-05 19:35:25       96 阅读

热门阅读

  1. 正则表达式

    2024-06-05 19:35:25       24 阅读
  2. 二分学习·P10389 [蓝桥杯 2024 省 A] 成绩统计

    2024-06-05 19:35:25       28 阅读
  3. .Net Core WebAPI参数的传递方式

    2024-06-05 19:35:25       50 阅读
  4. QT--气泡框的实现

    2024-06-05 19:35:25       47 阅读
  5. LeetCode 968.监控二叉树 (hard)

    2024-06-05 19:35:25       49 阅读
  6. leetcode热题100.完全平方数(动态规划进阶)

    2024-06-05 19:35:25       48 阅读
  7. leetcode328-Odd Even Linked List

    2024-06-05 19:35:25       50 阅读
  8. C 语言设计模式(结构型)

    2024-06-05 19:35:25       45 阅读
  9. v-if 与 v-show(vue3条件渲染)

    2024-06-05 19:35:25       51 阅读
  10. kafka防止消息丢失配置

    2024-06-05 19:35:25       49 阅读
  11. Git 基础使用(4)标签管理

    2024-06-05 19:35:25       39 阅读