MySQL 的索引下推是什么?

索引下推(Index Condition Pushdown, ICP)是 MySQL 优化器在 InnoDB 存储引擎中引入的一种查询优化技术,从 MySQL 5.6 开始支持。它的目的是通过将部分查询条件“下推”到存储引擎层,在扫描索引时就进行过滤,减少数据的回表次数,提升查询性能。


1. 索引下推的原理

  • 传统方法:MySQL 在存储引擎中扫描索引后,返回主键值给服务器层,服务器层再回表获取完整行数据并进行条件过滤。
  • 索引下推:MySQL 将部分查询条件下推到存储引擎,存储引擎在扫描索引时即可过滤掉不符合条件的记录,减少回表次数。

2. 示例分析

假设有如下表结构和索引:

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
department VARCHAR(50),
KEY idx_name_age (name, age)
);

(1)传统查询方式(未启用索引下推)

执行以下查询:

SELECT * FROM employees WHERE name = 'Alice' AND age > 30;
  • 过程

    1. 存储引擎使用 idx_name_age 索引扫描所有 name = 'Alice' 的记录。
    2. 将符合条件的主键值返回给服务器层。
    3. 服务器层根据主键值回表获取完整行数据。
    4. 服务器层再过滤 age > 30 的条件。
  • 问题

    • 即使部分记录不符合 age > 30,索引扫描时无法过滤,导致不必要的回表操作。

(2)启用索引下推

执行相同的查询:

SELECT * FROM employees WHERE name = 'Alice' AND age > 30;
  • 过程

    1. 存储引擎使用 idx_name_age 索引扫描,并在扫描过程中直接应用 age > 30 的过滤条件。
    2. 只有满足 name = 'Alice' AND age > 30 的记录会返回主键值。
    3. 服务器层根据主键值回表获取完整行数据。
  • 优化效果

    • 存储引擎过滤掉了大部分不符合条件的记录,显著减少了回表次数。

3. 索引下推的适用场景

  • 多列联合索引:部分查询条件可在索引扫描时应用。
  • 查询过滤较强:索引中字段的过滤条件能显著减少数据量。
  • 大数据量查询:索引下推的优化效果在大数据量查询中更为明显。

4. 示例对比

查询条件 是否使用索引下推 描述
WHERE name = 'Alice' 只使用了索引的首列,无需索引下推。
WHERE name = 'Alice' AND age > 30 索引下推在扫描索引时应用了 age > 30 的条件。
WHERE age > 30 不符合最左前缀原则,索引无法有效使用。

5. 注意事项

  1. 依赖于索引的设计

    • 索引下推需要查询条件中的字段在索引中存在,并符合最左前缀原则。
  2. 过滤效果的影响

    • 如果下推的条件无法有效过滤数据,则优化效果不明显。
  3. MySQL 版本支持

    • 索引下推从 MySQL 5.6 开始支持,需确保数据库版本兼容。

6. 总结

索引下推通过将部分查询条件下推到存储引擎层,使得在索引扫描阶段就能过滤数据,从而减少回表次数,提高查询效率。它在多列联合索引中尤为有效,是优化复杂查询的一个重要工具。

MySQL 的索引下推是什么?的更多相关文章

  1. MySQL索引下推,原来这么简单!

    大家好,我是大彬~ 今天给大家分享MySQL的索引下推. 什么是索引下推 索引条件下推,也叫索引下推,英文全称Index Condition Pushdown,简称ICP. 索引下推是MySQL5.6 ...

  2. 【mysql】索引相关的个人总结

    重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理.示例优化都写的很好. 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好. [从入门到入土]令人脱发 ...

  3. MySQL索引下推技术

    索引下推整个思路如下: To see how this optimization works, consider first how an index scan proceeds when Index ...

  4. Mysql系列(十二)—— 索引下推优化

    索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...

  5. MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

    本节内容: 1)索引基础 2)索引类型(Hash索引.有序数组.B+树) 3)索引的几个常见问题 1)联合索引 2)最左前缀原则 3)覆盖索引 4)索引下推 1. 索引基础 索引对查询的速度有着至关重 ...

  6. Mysql性能优化:什么是索引下推?

    导读 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询. 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行 ...

  7. 【mysql】索引 回表 覆盖索引 索引下推

    索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...

  8. MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序   What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...

  9. 五分钟搞懂MySQL索引下推

    大家好,我是老三,今天分享一个小知识点--索引下推. 如果你在面试中,听到MySQL5.6"."索引优化" 之类的词语,你就要立马get到,这个问的是"索引下推 ...

  10. 一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"加班使我快乐". 面试官: ...

随机推荐

  1. flutter中 ListView的使用

    1.ListView的简单介绍 ListView是最常用的可以滚动组件之一, 它可以沿一个方向进行线性排列所有的子组件. 下面是ListView的属性值介绍: scrollDirection:列表的滚 ...

  2. uni-app根据不同的类型绑定不同类名

    <template> <view class="page-demo"> <view class="demo" v-for=&quo ...

  3. 基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比

    基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比 目       录 1.      使用效果对比基础 2.      Cherry Studio和Any ...

  4. linux安装flink

    参考链接https://blog.csdn.net/boling_cavalry/article/details/85038527   1.下载flink 在Flink官网下载,地址是:https:/ ...

  5. Hetao P1156 最大战力 题解 [ 绿 ][ 二分 ][ 最大子段和 ]

    最大战力 Vjudge 原题 题解 形式化题意 给定两个数组 \(a[n]\) 和 \(b[n]\) ,需要在数组 \(b\) 中选择一个区间 \(b[l,r]\) ,替换掉区间 \(a[l,r]\) ...

  6. c++用正则表达式判断匹配字符串中的数字数值(包括负数,小数,整数)MFC编辑框判断数值

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12097381.html 因为今天做那个MFC的编辑框有一些框就是要判断输入的是否是数值,一开始 ...

  7. Typescript通用帮助类,格式化日期时间等

    /** * 格式化日期选项 */ export class DateFormatOption { "M+": number;//月 "d+": number;/ ...

  8. 使用Windows任务计划程序实现每天更换一张Processing创意桌面壁纸

    Windows任务计划程序(Windows Task Scheduler)是Windows操作系统中的一项系统工具,它允许用户安排自动执行的任务.通过任务计划程序,用户可以设定特定的时间或条件来运行各 ...

  9. Easyexcel(1-注解使用)

    版本依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</a ...

  10. Win10 非正常断电重启后出现长时间磁盘100%活动占用

    老毛病,以往半个小时左右会正常,这次上电1s发现风扇被卡马上关机,在启动结果硬生生卡了1h:应该是触发了微软某些后台的某些服务进程,记录一下 可疑涉事进程记录: svchost:Win服务主进程,是层 ...