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上还贴着公司标语:"加班使我快乐". 面试官: ...
随机推荐
- flutter中 ListView的使用
1.ListView的简单介绍 ListView是最常用的可以滚动组件之一, 它可以沿一个方向进行线性排列所有的子组件. 下面是ListView的属性值介绍: scrollDirection:列表的滚 ...
- uni-app根据不同的类型绑定不同类名
<template> <view class="page-demo"> <view class="demo" v-for=&quo ...
- 基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比
基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比 目 录 1. 使用效果对比基础 2. Cherry Studio和Any ...
- linux安装flink
参考链接https://blog.csdn.net/boling_cavalry/article/details/85038527 1.下载flink 在Flink官网下载,地址是:https:/ ...
- Hetao P1156 最大战力 题解 [ 绿 ][ 二分 ][ 最大子段和 ]
最大战力 Vjudge 原题 题解 形式化题意 给定两个数组 \(a[n]\) 和 \(b[n]\) ,需要在数组 \(b\) 中选择一个区间 \(b[l,r]\) ,替换掉区间 \(a[l,r]\) ...
- c++用正则表达式判断匹配字符串中的数字数值(包括负数,小数,整数)MFC编辑框判断数值
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12097381.html 因为今天做那个MFC的编辑框有一些框就是要判断输入的是否是数值,一开始 ...
- Typescript通用帮助类,格式化日期时间等
/** * 格式化日期选项 */ export class DateFormatOption { "M+": number;//月 "d+": number;/ ...
- 使用Windows任务计划程序实现每天更换一张Processing创意桌面壁纸
Windows任务计划程序(Windows Task Scheduler)是Windows操作系统中的一项系统工具,它允许用户安排自动执行的任务.通过任务计划程序,用户可以设定特定的时间或条件来运行各 ...
- Easyexcel(1-注解使用)
版本依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</a ...
- Win10 非正常断电重启后出现长时间磁盘100%活动占用
老毛病,以往半个小时左右会正常,这次上电1s发现风扇被卡马上关机,在启动结果硬生生卡了1h:应该是触发了微软某些后台的某些服务进程,记录一下 可疑涉事进程记录: svchost:Win服务主进程,是层 ...