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. 如何在WPS和Word/Excel中直接使用DeepSeek功能

    以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:https://www.of ...

  2. 【忍者算法】从十字路口相遇到链表交点:探索相交链表问题|LeetCode第160题 相交链表

    从十字路口相遇到链表交点:探索相交链表问题 生活中的相遇问题 想象两个人从不同的地方出发,最后在一个十字路口相遇.他们可能走过不同长度的路程,但最终会在同一个点汇合.这就很像我们今天要讨论的相交链表问 ...

  3. Codeforces Round 999 比赛记录

    前情提要 这个菜鸡CF上了 \(\color{darkcyan}Specialist\),心情大好,正好赶上放假,决定打一场CF. 赛时记录 A 上来脑子抽了,吃了一发罚时.发现写错了一种情况,改过来 ...

  4. flutter-TextField文本输入框 限制 数字键盘、输入小数点后两位

    关键代码 keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter(RegExp(" ...

  5. 2024年! kali高级配置加一键教程加前人的经验加后人的实践

    2024年! kali高级配置加一键教程加前人的经验加后人的实践 记录一下配置kali的过程,方便下次需要直接复制粘贴 直接终端按照顺序输入就可以配置好 作者已踩点,请放心 kali更换国内源 sud ...

  6. Typecho如何去掉/隐藏index.php

    Typecho后台设置永久链接后,会在域名后加上index.php,很多人都接受不了.例如如下网址:https://www.jichun29.cn/index.php/archives/37/,但我们 ...

  7. Typecho博客后台登陆界面美化

    登录界面: 食用方法: 备份 admin 目录 压缩包内容上传到 admin 目录内. 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login ...

  8. 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐

    title: 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 date: 2025/2/26 updated: 2025/2/26 author: cmdragon ex ...

  9. 解决win11输入法自定义短语有多个当前日期只有最后一个生效

    由于win11自定义短语保存机制问题导致只有最后一个当前日期短语生效** 1.首先找到自定义短语存储文件的具体路径:%AppData%\Microsoft\InputMethod\Chs\ 拼音输入法 ...

  10. C# Quartz 调度任务辅助类

    1 public class QuartzHelper 2 { 3 /// <summary> 4 /// 时间间隔执行任务 5 /// </summary> 6 /// &l ...