MySQL索引下推index condition pushdown

 更新时间:2024年08月05日 10:20:47   作者:zxrhhm  
索引下推是MySQL 5.6版本引入的一种数据库查询优化技术,本文主要介绍了MySQL索引下推index condition pushdown,具有一定的参考价值,感兴趣的可以了解一下

索引下推(Index Condition Pushdown,简称ICP)是MySQL 5.6版本引入的一种数据库查询优化技术。ICP的主要目的是通过利用数据库引擎中的索引和过滤条件,将部分过滤工作下推到存储引擎层面进行处理,从而减少不必要的数据读取和传输,提升查询性能和整体系统效率。

索引下推的工作原理

在传统的查询执行过程中,数据库引擎首先根据索引定位到符合过滤条件的数据行,并将这些数据行读取到内存中,然后再进一步进行过滤操作。而索引下推则在这一步骤中尽可能地将过滤操作下推到存储引擎层面,避免将不符合条件的数据行读取到内存中。具体实现方式可以是通过存储引擎提供的接口或者钩子函数,让存储引擎在读取索引页时就进行额外的过滤操作。

索引下推的优势

  • 减少数据读取和传输:通过索引下推,可以在存储引擎层面就过滤掉不符合条件的数据,减少了需要传递给查询引擎的数据量和内存消耗。
  • 降低磁盘I/O:由于减少了不必要的数据读取,因此也降低了磁盘I/O的次数,这对于提升查询性能尤为重要。
  • 提高查询效率:在复杂查询条件、多列条件的查询中,索引下推能够更有效地减少不必要的数据读取和传输,从而提高查询效率。

索引下推的应用场景

  • 索引下推并不是对所有类型的查询都适用,它更适用于那些包含复杂查询条件、多列条件的查询场景。在这些场景中,索引下推能够显著减少查询过程中的数据读取和传输量,从而提升查询性能。

索引下推与回表查询

  • 在联合索引的场景中,索引下推还可以减少回表查询的次数。例如,当为age和name字段创建了联合索引,并执行查询语句SELECT * FROM EMPLOYEES WHERE first_name LIKE ‘James’ AND last_name = ‘Landry’;时,如果没有使用索引下推,MySQL会根据联合索引查询first_name 字段等于"James"的数据,然后进行回表查询以获取完整的数据行。而使用索引下推后,MySQL会在存储引擎层面就进一步判断last_name 是否等于Landry,只有同时满足这两个条件的数据行才会被读取并返回给查询引擎,从而减少了回表查询的次数。

索引下推的启用与关闭

select @@optimizer_switch  -- 默认是打开的 

-- 关闭ICP
set optimizer_switch = 'index_condition_pushdown=off';

-- 打开ICP
set optimizer_switch = 'index_condition_pushdown=on';

set profiling=1

-- 使用索引下推
SELECT * FROM EMPLOYEES WHERE first_name LIKE 'James' AND last_name = 'Landry';

(root@localhost) 09:12:52 [test1]> SELECT * FROM EMPLOYEES WHERE first_name LIKE 'James' AND last_name = 'Landry';
+-------------+------------+-----------+---------+---------------+------------+----------+---------+----------------+------------+---------------+
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | EMAIL   | PHONE_decimal | HIRE_DATE  | JOB_ID   | SALARY  | COMMISSION_PCT | MANAGER_ID | DEPARTMENT_ID |
+-------------+------------+-----------+---------+---------------+------------+----------+---------+----------------+------------+---------------+
|         127 | James      | Landry    | JLANDRY | 650.124.1334  | 2007-01-14 | ST_CLERK | 2400.00 |           NULL |        120 |            50 |
+-------------+------------+-----------+---------+---------------+------------+----------+---------+----------------+------------+---------------+
1 row in set (0.00 sec)

(root@localhost) 09:08:52 [test1]> explain SELECT * FROM EMPLOYEES WHERE first_name LIKE 'James' AND last_name = 'Landry';
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
| id | select_type | table     | partitions | type  | possible_keys | key         | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | EMPLOYEES | NULL       | range | EMP_NAME_IX   | EMP_NAME_IX | 140     | NULL |    1 |   100.00 | Using index condition |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)

show profiles;

show profile for query 1;

show profile for query 2;

禁用 索引下推,观察执行计划

禁用 Index Condition Pushdown(ICP) 索引下推

(root@localhost) 09:22:32 [test1]> explain SELECT /*+ no_ipc () */ * FROM EMPLOYEES WHERE first_name LIKE 'James' AND last_name = 'Landry';
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key         | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | EMPLOYEES | NULL       | range | EMP_NAME_IX   | EMP_NAME_IX | 140     | NULL |    1 |   100.00 | Using where |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
1 row in set, 2 warnings (0.00 sec)

(root@localhost) 09:22:46 [test1]> explain SELECT * FROM EMPLOYEES WHERE first_name LIKE 'James' AND last_name = 'Landry';
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key         | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | EMPLOYEES | NULL       | range | EMP_NAME_IX   | EMP_NAME_IX | 140     | NULL |    1 |   100.00 | Using where |
+----+-------------+-----------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

总结

索引下推是MySQL 5.6及以上版本提供的一种查询优化技术,它通过将部分过滤工作下推到存储引擎层面进行处理,减少了不必要的数据读取和传输,降低了磁盘I/O次数,提高了查询性能和整体系统效率。在复杂查询条件、多列条件的查询场景中,索引下推能够发挥更大的作用。

到此这篇关于MySQL索引下推index condition pushdown的文章就介绍到这了,更多相关MySQL索引下推内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中的CONCAT()函数:轻松拼接字符串的利器

    MySQL中的CONCAT()函数:轻松拼接字符串的利器

    这篇文章主要介绍了MySQL中的CONCAT()函数:轻松拼接字符串的利器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Centos7.3下mysql5.7.18安装并修改初始密码的方法

    Centos7.3下mysql5.7.18安装并修改初始密码的方法

    这篇文章主要为大家详细介绍了Centos7.3下mysql5.7.18安装并修改初始密码的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • MySQL创建用户和权限管理的方法

    MySQL创建用户和权限管理的方法

    这篇文章主要介绍了MySQL创建用户和权限管理的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • MySQL中慢查询分析与索引优化实战技巧

    MySQL中慢查询分析与索引优化实战技巧

    这篇文章主要为大家详细介绍了MySQL中慢查询分析与索引优化相关实战技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-02-02
  • MySQL中Multiple primary key defined报错的解决办法

    MySQL中Multiple primary key defined报错的解决办法

    这篇文章主要介绍了MySQL中Multiple primary key defined报错的解决办法以及相关实例内容,有兴趣的朋友们学习下。
    2019-08-08
  • mysql判断查询条件是否包含某字符串的7种方式

    mysql判断查询条件是否包含某字符串的7种方式

    本文主要介绍了mysql判断查询条件是否包含某字符串,主要介绍了7种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 一文带你了解MySQL之连接原理

    一文带你了解MySQL之连接原理

    搞数据库一个避不开的概念就是Join,翻译成中⽂就是连接,相信很多小伙伴初学连接的时候有些一脸懵,理解了连接的语义之后又可能不明白各个表中的记录到底是怎么连起来的,所以本章就来学习连接的原理,需要的朋友可以参考下
    2023-05-05
  • MySQL语句整理及汇总介绍

    MySQL语句整理及汇总介绍

    今天小编就为大家分享一篇关于MySQL语句整理及汇总介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • MySQL学习笔记之创建、删除、修改表的方法

    MySQL学习笔记之创建、删除、修改表的方法

    这篇文章主要介绍了MySQL学习笔记之创建、删除、修改表的方法,结合实例分析了mysql创建表、增加,修改及删除列、查看表结构、删除表等基本语法与使用技巧,需要的朋友可以参考下
    2016-09-09
  • mysql 5.7.24 安装配置图文教程

    mysql 5.7.24 安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.24 安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论