Mysql 性能优化:索引条件下推(ICP)

MySQL 索引下推(Index Condition Pushdown,ICP)是一种查询优化技术,旨在提高使用索引的查询效率。它是在 MySQL 5.6 中引入的,通过将部分 WHERE 子句的过滤条件下推到索引扫描阶段来减少不必要的回表操作,从而提高查询性能。

和索引覆盖一样,索引条件下推和索引覆盖都是通过减少回表操作而减少 IO 操作进而提升性能的。 关于索引覆盖,可以参考文章:mysql 性能优化:覆盖索引

工作原理

在没有索引下推的情况下,MySQL 在使用索引扫描时,会首先通过索引找到可能的行,然后将这些行通过回表操作将数据读出来,再在服务器层面应用 WHERE 子句的条件进行过滤。这意味着即使某些行在 WHERE 子句中不符合条件,MySQL 也会进行回表操作来读取这些行数据。

有了索引下推,MySQL 会在索引扫描阶段就应用部分 WHERE 子句的条件。这意味着只有符合这些条件的索引记录对应的行才会被提取出来进行进一步处理,从而减少了回表操作。

索引条件下推强调的是 Where 条件中有索引字段但是索引字段失效无法正常走索引,如果索引字段未失效,其实就会天然的利用上联合索引字段。

适用条件

索引下推适用于以下情况:

  1. 索引列被用于过滤:查询的 WHERE 子句中包含了索引列,并且这些条件可以在索引扫描阶段进行过滤。
  2. 复合索引:在使用复合索引时,能够在索引扫描阶段应用非索引前缀列的过滤条件。

示例

假设有一个表 employees

sql 复制代码
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    salary DECIMAL(10, 2),
    INDEX idx_department_salary (department_id, salary)
);     

考虑如下查询:

sql 复制代码
SELECT * FROM employees WHERE department_id = 5 AND salary <> 50000;        

在这个查询中:

  • department_id 是索引的前缀列,MySQL 可以通过索引快速定位到 department_id = 5 的记录。
  • salary <> 50000 是一个额外的过滤条件。

有了索引下推,MySQL 可以在索引扫描阶段就应用 salary <> 50000 的条件,这样只有符合这两个条件的记录才会被提取出来进行进一步处理。

优点

  • 减少 I/O 操作:通过在索引扫描阶段应用更多的过滤条件,减少回表操作。
  • 提高查询性能:减少了需要处理的行数,从而提高了查询效率。
相关推荐
wh_xia_jun34 分钟前
mybatis xml 配置中,jdbcType=VARCHAR 的作用
数据库·oracle·tomcat
程序猿小D1 小时前
第24节 Node.js 连接 MongoDB
数据库·mongodb·npm·node.js·编辑器·vim·express
意疏2 小时前
深入解析MySQL Join算法原理与性能优化实战指南
mysql·算法·性能优化
fictionist2 小时前
动态 Web 开发技术入门篇
java·服务器·开发语言·笔记·学习·mysql·spring
果子⌂3 小时前
PostgreSQL --数据库操作
linux·数据库·postgresql
SeaTunnel3 小时前
如何将SeaTunnel MySQL-CDC与Databend 高效整合?格式与方案全解析
数据库·mysql·开源·数据集成·seatunnel·databend
在肯德基吃麻辣烫3 小时前
《Redis》持久化
数据库·redis·缓存
顾三殇3 小时前
【自考】《计算机信息管理课程实验(课程代码:11393)》华师自考实践考核题型解析说明:C++ 与 mysql 实践题型与工具实践题分析
c++·mysql·华师自考实践考核题型分析
xiaolyuh1233 小时前
基于binlog恢复误删除MySQL数据
数据库·mysql
Gauss松鼠会3 小时前
GaussDB分布式数据库调优方法总结:从架构到实践的全链路优化指南
数据库·分布式·sql·database·gaussdb