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 操作:通过在索引扫描阶段应用更多的过滤条件,减少回表操作。
  • 提高查询性能:减少了需要处理的行数,从而提高了查询效率。
相关推荐
鸿永与1 小时前
『SQLite』表达式操作
数据库·sqlite
Bytebase3 小时前
MySQL 如何赶上 PostgreSQL 的势头?
运维·数据库·dba·开发者·数据库管理·devops
acegi135794 小时前
MySQL - 子查询和相关子查询详解
数据库·mysql
背太阳的牧羊人4 小时前
使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中
数据库·sql·langchain·excel
你若安好我便天晴5 小时前
sql--MERGE INTO
数据库·sql
半桶水专家5 小时前
go怎么终止协程的运行
数据库·sql·golang
weixin_438335405 小时前
【更新中】Mysql问题分析
数据库·mysql
huaqianzkh6 小时前
Redis的内存预分配策略
数据库·redis·缓存
有馬公生6 小时前
有关Redis的相关概述
数据库·redis·缓存
qincjun6 小时前
Qt仿音乐播放器:数据库持久化
开发语言·数据库·qt