MySQL-索引下推

MySQL-索引下推

前言

MySQL5.6 引入了一项查询优化技术:索引下推(Index Condition Pushdown,简称 ICP)。

目前只有MyISAM 和InnoDB 支持了ICP。

下面就来简单讲讲到底什么是ICP吧。

MySQL服务层与存储引擎层

在MySQL初期设计时,由于当时的局限性,以及为了对MySQL服务层 和存储引擎层 进行职责划分,所以存储引擎层 的主要职责是快速借助索引定位数据,然后将数据返回给MySQL服务层,服务层可以更好更快速的对数据进行过滤处理。

所以存储引擎层 为了快速地定位数据,只会进行简单的数据过滤。也就是说,如果查询语句的where 后通过and 连接了多个过滤条件,存储引擎层一般只会执行部分简单的条件。

例如:SELECT * FROM users WHERE age > 30 AND name LIKE 'A%'; 就算有联合索引(age,name) ,存储引擎也只会执行age>30 ,将符合该条件的数据全部返回给MySQL服务层 ,再由服务层对数据进行name LIKE 'A%' 条件过滤。

ICP

通过前面的讲解,我们知道了,由于初期MySQL设计的局限性,存储引擎层 没有充分的用到索引,导致返回了大量多余数据给MySQL服务层 ,此外存储引擎层在数据查询时也容易产生多余的回表操作。

MySQL完全可以在存储引擎层 利用联合索引(age,name) ,执行完被索引覆盖 的全部的 age > 30 AND name LIKE 'A%' 过滤条件,就可以返回较少的数据给MySQL服务层 。这个技术就是ICP。

可以看到,ICP 就是将MySQL服务层 需要执行的部分复杂条件过滤下推 到存储引擎层 执行,有利于减少存储引擎层与MySQL服务层之间的数据传输开销 ,也有利于减少回表,提高MySQL查询效率。

补充

ICP 在查询条件能够被索引覆盖的情况下才有意义,所以联合索引 、覆盖索引 与ICP 以及其它优化查询的技术之间往往是相辅相成的。

相关推荐
todoitbo几秒前
报表总在扫大表,列存储应该放在哪一层
大数据·数据库·报表·国产数据库
瑞克-桑切斯2 分钟前
MySQL部署手册(5.7.20/8.0)
数据库·mysql
ss27317 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 19 PostgreSQL逻辑备份:pg_dump与pg_dumpall
数据库·笔记·postgresql
啵啵啵鱼20 分钟前
九、JDBC 操作 MySQL 数据库
android·数据库·mysql
handonch21 分钟前
MySQL → Kingbase PG模式 高频SQL替换清单
数据库·mysql·postgresql
姜鱼问生23 分钟前
Kuma SQLite 备份坑
数据库·sqlite
水无痕simon27 分钟前
15 MySQL是怎么保证高可用的?
数据库·mysql
漫步人生走在路上32 分钟前
外贸SEO中的品牌词与产品词策略:大卖家和小卖家的不同打法
大数据·javascript·网络·数据库·人工智能·搜索引擎
张小姐的猫33 分钟前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
泡海椒35 分钟前
JQuick-SQL LIMIT 分页:限制行数与偏移查询
数据库·sql