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上还贴着公司标语:"加班使我快乐". 面试官: ...
随机推荐
- Exfiltrated pg walkthrough Easy
80端口弱口令admin admin 发现cms 搜索exp 发现漏洞 https://www.exploit-db.com/exploits/49876 找到敏感数据库密码和用户 ╔════════ ...
- python ModuleNotFoundError_ No module named 'xxx'的解决方案
本文主要针对的自己写的包无法正常import的情况,如果是第三方包的话正常来说没有问题. 第三方包 主要考虑没有安装对应的版本以及包名写错了等奇葩情况,具体可参考ModuleNotFoundError ...
- npm run的时候报错: this[kHandle] = new _Hash(algorithm, xofLen);
在前面加入以下配置信息 set NODE_OPTIONS=--openssl-legacy-provider && 后面跟原来的启动配置信息 另外一种方式,可以避免修改package. ...
- Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
Brainfuck 简介 Brainfuck 是由 Urban Müller 在 1993 年创造的一门非常精简的图灵完备的编程语言. 正所谓大道至简,这门编程语言简单到语法只有 8 个字符,每一个字 ...
- [记录点滴] Spark迁移到Flink的几个点
[记录点滴] Spark迁移到Flink的几个点 0x00 三个问题点 有三个Spark API需要找到对应的Flink API或者替代方法 reduceByKeyAndWindow 函数reduce ...
- Amazon Dynamo系统架构
Amazon Dynamo系统架构 目录 Amazon Dynamo系统架构 0x00 摘要 0x01 Amazon Dynamo 1.1 概况 1.2 主要问题及解决方案 1.3 数据均衡分布 1. ...
- centos系统chrony时间同步
centos系统chrony时间同步 概要 chrony 是网络时间协议(Network Time Protocol )的通用实现.它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 ...
- FLink自定义Kafka Source,处理后转发给下一个kafka topic
一.依赖配置 pom文件:https://www.cnblogs.com/robots2/p/16048648.html kafka单机版安装:https://www.cnblogs.com/robo ...
- keycloak~关于社区认证的总结
keycloak关于社区认证它有统一的设计,社区认证包括了github,microsoft,wechat,qq,dingtalk等等,当然你还可以扩展很多实现了oauth2协议的第三方社区,将它们对接 ...
- 【Spring】Spring的@Autowire注入Bean的规则测试
背景 在项目中使用Spring的Bean,一般都使用默认的Bean的单例,并且结合@Autowire使用. 实在有同一个类型多个实例的情况,也使用@Qualifier或@Resource实现注入. 所 ...