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 操作:通过在索引扫描阶段应用更多的过滤条件,减少回表操作。
  • 提高查询性能:减少了需要处理的行数,从而提高了查询效率。
相关推荐
不羁。。3 分钟前
【撸靶笔记】第八关:GET - Blind - Boolian Based - Single Quotes
数据库·sql·mybatis
AwhiteV43 分钟前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
m0_595199851 小时前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
爱尚你19931 小时前
MySQL 三大日志:redo log、undo log、binlog 详解
数据库·mysql
小猿姐3 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
NocoBase4 小时前
10 个开源工具,快速构建数据应用
数据库·低代码·开源
麻辣清汤4 小时前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
钢铁男儿5 小时前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
Kan先生6 小时前
对象存储解决方案:MinIO 的架构与代码实战
数据库·python
超级迅猛龙6 小时前
保姆级Debezium抽取SQL Server同步kafka
数据库·hadoop·mysql·sqlserver·kafka·linq·cdc