博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 索引条件下推 Index Condition Pushdown
阅读量:6199 次
发布时间:2019-06-21

本文共 1840 字,大约阅读时间需要 6 分钟。

MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下:

内容摘录自《深入理解MariaDB和MySQL》

下面使实验,使用官方提供的employees 测试数据库演示。

> use employees ;

> show create table employees \G

***************************[ 1. row ]***************************

Table        | employees

Create Table | CREATE TABLE `employees` (

  `emp_no` int(11) NOT NULL,

  `birth_date` date NOT NULL,

  `first_name` varchar(14) NOT NULL,

  `last_name` varchar(16) NOT NULL,

  `gender` enum('M','F') NOT NULL,

  `hire_date` date NOT NULL,

  PRIMARY KEY (`emp_no`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

> alter table employees add index idx_lastname_firstname(last_name,first_name);


关闭ICP:

> set optimizer_switch='index_condition_pushdown=off';

> explain extended select * from employees where last_name='Action' and first_name LIKE '%sal' ;

***************************[ 1. row ]***************************

id            | 1

select_type   | SIMPLE

table         | employees

type          | ref

possible_keys | idx_lastname_firstname

key           | idx_lastname_firstname

key_len       | 18

ref           | const

rows          | 1

filtered      | 100.0

Extra         | Using where


查询条件中的first_name 这个前面%匹配导致无法用到整个idx_lastname_firstname 索引的,只能根据last_name 字段过滤部分数据,然后在里面找出符合first_name列 %sal的行记录。

image.png

但是,如果开启ICP,则执行计划如下:

> set optimizer_switch='index_condition_pushdown=on';

> explain extended select * from employees where last_name='Action' and first_name LIKE '%sal' \G

***************************[ 1. row ]***************************

id            | 1

select_type   | SIMPLE

table         | employees

type          | ref

possible_keys | idx_lastname_firstname

key           | idx_lastname_firstname

key_len       | 18

ref           | const

rows          | 1

filtered      | 100.0

Extra         | Using index condition


原理:

索引比较是在InnoDB存储引擎层进行的。而数据表的记录比较first_name条件是在MySQL引擎层进行的。开启ICP之后,包含在索引中的数据列条件(即上述SQL中的first_name LIKE %sal') 都会一起被传递给InnoDB存储引擎,这样最大限度的过滤掉无关的行

执行计划如下图:

image.png

本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/2060449,如需转载请自行联系原作者
你可能感兴趣的文章
Go编程笔记(35)
查看>>
Sublime 下配置vim模式
查看>>
关于handler和线程
查看>>
svn服务器环境搭建个人记录
查看>>
javascript中的box2d使用大全记录
查看>>
Android Matrix类以及ColorMatrix类详解
查看>>
心情小叙
查看>>
高手是怎样炼成的
查看>>
Linux iptables 配置详解
查看>>
RabbitMQ学习笔记(1)——AMQP
查看>>
和 Thrift 的一场美丽邂逅
查看>>
利用paramiko模块批量登录(执行命令/上传文件)
查看>>
关于网页开发webpack基本配置.
查看>>
phper从st到vscode
查看>>
基于容器服务的持续集成与云端交付(一)- 交付之禅
查看>>
我的友情链接
查看>>
02-SCCM2012-站点配置文档
查看>>
mysql性能优化
查看>>
Jailkit 监牢软件
查看>>
Rhel6服务器dump备份和restore恢复以及dd的使用
查看>>