MySQL 的索引下推是什么?
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;
过程:
- 存储引擎使用
idx_name_age索引扫描所有name = 'Alice'的记录。 - 将符合条件的主键值返回给服务器层。
- 服务器层根据主键值回表获取完整行数据。
- 服务器层再过滤
age > 30的条件。
- 存储引擎使用
问题:
- 即使部分记录不符合
age > 30,索引扫描时无法过滤,导致不必要的回表操作。
- 即使部分记录不符合
(2)启用索引下推
执行相同的查询:
SELECT * FROM employees WHERE name = 'Alice' AND age > 30;
过程:
- 存储引擎使用
idx_name_age索引扫描,并在扫描过程中直接应用age > 30的过滤条件。 - 只有满足
name = 'Alice' AND age > 30的记录会返回主键值。 - 服务器层根据主键值回表获取完整行数据。
- 存储引擎使用
优化效果:
- 存储引擎过滤掉了大部分不符合条件的记录,显著减少了回表次数。
3. 索引下推的适用场景
- 多列联合索引:部分查询条件可在索引扫描时应用。
- 查询过滤较强:索引中字段的过滤条件能显著减少数据量。
- 大数据量查询:索引下推的优化效果在大数据量查询中更为明显。
4. 示例对比
| 查询条件 | 是否使用索引下推 | 描述 |
|---|---|---|
WHERE name = 'Alice' |
否 | 只使用了索引的首列,无需索引下推。 |
WHERE name = 'Alice' AND age > 30 |
是 | 索引下推在扫描索引时应用了 age > 30 的条件。 |
WHERE age > 30 |
否 | 不符合最左前缀原则,索引无法有效使用。 |
5. 注意事项
依赖于索引的设计:
- 索引下推需要查询条件中的字段在索引中存在,并符合最左前缀原则。
过滤效果的影响:
- 如果下推的条件无法有效过滤数据,则优化效果不明显。
MySQL 版本支持:
- 索引下推从 MySQL 5.6 开始支持,需确保数据库版本兼容。
6. 总结
索引下推通过将部分查询条件下推到存储引擎层,使得在索引扫描阶段就能过滤数据,从而减少回表次数,提高查询效率。它在多列联合索引中尤为有效,是优化复杂查询的一个重要工具。
MySQL 的索引下推是什么?的更多相关文章
- MySQL索引下推,原来这么简单!
大家好,我是大彬~ 今天给大家分享MySQL的索引下推. 什么是索引下推 索引条件下推,也叫索引下推,英文全称Index Condition Pushdown,简称ICP. 索引下推是MySQL5.6 ...
- 【mysql】索引相关的个人总结
重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理.示例优化都写的很好. 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好. [从入门到入土]令人脱发 ...
- MySQL索引下推技术
索引下推整个思路如下: To see how this optimization works, consider first how an index scan proceeds when Index ...
- Mysql系列(十二)—— 索引下推优化
索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
本节内容: 1)索引基础 2)索引类型(Hash索引.有序数组.B+树) 3)索引的几个常见问题 1)联合索引 2)最左前缀原则 3)覆盖索引 4)索引下推 1. 索引基础 索引对查询的速度有着至关重 ...
- Mysql性能优化:什么是索引下推?
导读 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询. 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行 ...
- 【mysql】索引 回表 覆盖索引 索引下推
索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...
- MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...
- 五分钟搞懂MySQL索引下推
大家好,我是老三,今天分享一个小知识点--索引下推. 如果你在面试中,听到MySQL5.6"."索引优化" 之类的词语,你就要立马get到,这个问的是"索引下推 ...
- 一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推
迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"加班使我快乐". 面试官: ...
随机推荐
- 如何在WPS和Word/Excel中直接使用DeepSeek功能
以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:https://www.of ...
- 【忍者算法】从十字路口相遇到链表交点:探索相交链表问题|LeetCode第160题 相交链表
从十字路口相遇到链表交点:探索相交链表问题 生活中的相遇问题 想象两个人从不同的地方出发,最后在一个十字路口相遇.他们可能走过不同长度的路程,但最终会在同一个点汇合.这就很像我们今天要讨论的相交链表问 ...
- Codeforces Round 999 比赛记录
前情提要 这个菜鸡CF上了 \(\color{darkcyan}Specialist\),心情大好,正好赶上放假,决定打一场CF. 赛时记录 A 上来脑子抽了,吃了一发罚时.发现写错了一种情况,改过来 ...
- flutter-TextField文本输入框 限制 数字键盘、输入小数点后两位
关键代码 keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter(RegExp(" ...
- 2024年! kali高级配置加一键教程加前人的经验加后人的实践
2024年! kali高级配置加一键教程加前人的经验加后人的实践 记录一下配置kali的过程,方便下次需要直接复制粘贴 直接终端按照顺序输入就可以配置好 作者已踩点,请放心 kali更换国内源 sud ...
- Typecho如何去掉/隐藏index.php
Typecho后台设置永久链接后,会在域名后加上index.php,很多人都接受不了.例如如下网址:https://www.jichun29.cn/index.php/archives/37/,但我们 ...
- Typecho博客后台登陆界面美化
登录界面: 食用方法: 备份 admin 目录 压缩包内容上传到 admin 目录内. 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login ...
- 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐
title: 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 date: 2025/2/26 updated: 2025/2/26 author: cmdragon ex ...
- 解决win11输入法自定义短语有多个当前日期只有最后一个生效
由于win11自定义短语保存机制问题导致只有最后一个当前日期短语生效** 1.首先找到自定义短语存储文件的具体路径:%AppData%\Microsoft\InputMethod\Chs\ 拼音输入法 ...
- C# Quartz 调度任务辅助类
1 public class QuartzHelper 2 { 3 /// <summary> 4 /// 时间间隔执行任务 5 /// </summary> 6 /// &l ...