MySQL索引下推(ICP)的简单理解与示例


本文整理自网络,侵删。

前言

索引下推(Index Condition Pushdown, 简称ICP)是MySQL 5.6 版本的新特性,它能减少回表查询次数,提升检索效率。

MySQL体系结构

要明白索引下推,首先要了解MySQL的体系结构:

上图来自MySQL官方文档。

通常把MySQL从上至下分为以下几层:

  • MySQL服务层:包括NoSQL和SQL接口、查询解析器、优化器、缓存和Buffer等组件。
  • 存储引擎层:各种插件式的表格存储引擎,实现事务、索引等各种存储引擎相关的特性。
  • 文件系统层: 读写物理文件。

MySQL服务层负责SQL语法解析、触发器、视图、内置函数、binlog、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。“索引下推”的“下”其实就是指将部分上层(服务层)负责的事情,交给了下层(存储引擎)去处理。

索引下推案例

假设用户表数据和结构如下:

id age birthday name
1 18 01-01 User1
2 19 03-01 User2
3 20 03-01 User3
4 21 03-01 User4
5 22 05-01 User5
6 18 06-01 User6
7 24 01-01 User7

创建一个联合索引(age, birthday),并查询出年龄>20,且生日为03-01的用户:

select * from user where age>20 and birthday="03-01"

由于age字段使用了范围查询,根据最左前缀原则,这种情况只能使用age字段进行范围查询,索引中的birthday字段无法使用。使用explain查看执行计划:

+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
| id   | select_type | table | type  | possible_keys | key          | key_len | ref  | rows | Extra                 |
+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
|    1 | SIMPLE      | user  | range | age_birthday  | age_birthday | 4       | NULL | 3    | Using index condition |
+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+

可以看到虽然使用了age_birthday索引,但是索引长度key_len只有4,说明只有联合索引只有age字段生效了(因为age字段是int类型,占用4个字节)。最后Extra列的Using index condition表示这个查询使用了索引下推优化。

阅读剩余部分

相关阅读 >>

mysql怎样查看当前连接数

详解mysql中union的用法

mysql如何改变存储位置

分享一个纯 python 实现的 mysql 客户端操作库

mysql分布式恢复进阶

mysql联合查询实例分享

mysql的enum类型实例测试

mysql如何查询索引状态?

mysql基础快速入门知识总结(附思维导图)

mysql求2个或以上字段为null值的实例分享

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...