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 操作:通过在索引扫描阶段应用更多的过滤条件,减少回表操作。
  • 提高查询性能:减少了需要处理的行数,从而提高了查询效率。
相关推荐
严同学正在努力18 小时前
从备份到恢复:我用 30 分钟恢复了误删的核心业务表
android·java·数据库·ai
#六脉神剑18 小时前
myBuilder新版本(8月,Office文件预览、Oracle数据库支持)
数据库·oracle·开发平台·数字化工具·mybuilder
花青泽18 小时前
5-数据库-SQL注入-联合查询-AND/OR绕过-day13
数据库·sql
踏着七彩祥云的小丑19 小时前
忘记Redis是否安装过时查看
数据库·redis·缓存
Nontee20 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
眞bilibili20 小时前
带团队后的日常思考(十七)
数据库
laboratory agent开发21 小时前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库
xqqxqxxq21 小时前
DML 表数据:插入、删除、修改
笔记·mysql
段一凡-华北理工大学21 小时前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
DBA_G1 天前
南大通用GBase HD数据平台讲解
数据库