加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL 索引条件下推 Index Condition Pushdown

发布时间:2022-09-15 15:10:51 所属栏目:MySql教程 来源:
导读:  MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下:

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

  下面使实验,使用官方提供的employees

  MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下:
 
  内容摘录自《深入理解MariaDB和MySQL》
 
  下面使实验,使用官方提供的employees 测试数据库演示。
 
  > useemployees ;
 
  > 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的行记录。

  但是MySQL 索引,如果开启ICP,则执行计划如下:
 
  MySQL 索引_mysql删除索引_mysql索引和聚合索引
 
  > 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_nameLIKE %sal') 都会一起被传递给InnoDB存储引擎,这样最大限度的过滤掉无关的行。
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!