开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MySQL 索引条件下推 Index Condition Pushdown

简介:
+关注继续查看

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
安装 MySql | 学习笔记
快速学习安装 MySql。
56 0
windows 10 下 mysql的安装
win10下 mysql的安装 今天在win10下装Mysql,总结一下安装详细过程: 1、下载【先进入官网: https://www.mysql.com/】(按照如下截图一步一步执行即可)           2、安装 下载出来的会是一个压缩包,解压到你打算安装的目录下边(不像图形化界面安装那样还需要点击一系列【next】),但是离完全安装成功,现在才是刚刚开始。
1565 0
mac下安装mysql
mac下安装mysql 根据我的自身经验来看,windows、liunx、mac这三个平台来看,mac上安装到正常运行是最耗我时间的。因此纪录下来,下次遇到有地方可查。 1、mysql下载安装: https://dev.mysql.com/downloads/mysql/ 这里要注意的是,最好安装和你系统匹配的版本,不然后续可能会遇到一些奇怪的错误。
4281 0
Mac上安装MySQL
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/73824618 本篇文章没有技术含量,重在传播。
591 0
Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)
Windows下mysql 64位 安装(mysql-5.7.11-winx64安装) 系统Windows10 安装包mysql-5.7.11-winx64.zip 安装过程中遇到的问题,请留意4.0常见问题汇总,常见问题都可解决。 附上最近一次完成安装记录,给大忙人看的只有两张图和完整的命令。 完成的命令 C:\Windows\syst
2564 0
Mac下安装MySQL
2015-07-13 15:10:32 Mac下用homebrew安装软件还是很方便的 brew install mysql 等待一会儿安装完毕后到安装目录:  /usr/local/Cellar/mysql/5.
760 0
MAC下homebre安装mysql
1.执行安装命令 brew install mysql 2.执行完输入mysql会有如下bug ERROR 2002 (HY000): Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) 3.bug解决方案 unset TMPDIR 4.然后 mysql_install_db --verbos
847 0
+关注
20376
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载