前置版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.26-log |
+------------+

先来建个表加个索引

DROP TABLE IF EXISTS `indexconditionpushdown`;
CREATE TABLE `indexconditionpushdown` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `multi_name_age` (`name`,`age`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of indexconditionpushdown
-- ----------------------------
INSERT INTO `indexconditionpushdown` VALUES ('1', '20', '陈某');
INSERT INTO `indexconditionpushdown` VALUES ('2', '30', '陈某某');
INSERT INTO `indexconditionpushdown` VALUES ('3', '30', '李某');

alter table indexConditionPushDown add index multi_name_age(name,age);

ICP版本

mysql> explain select * from indexConditionPushDown where name like "陈%" and age =20;
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-----------------------+
| id | select_type | table                  | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | indexConditionPushDown | NULL       | range | multi_name_age | multi_name_age | 771     | NULL |    1 |    33.33 | Using index condition |
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-----------------------+
1 row in set

禁用ICP

mysql> set optimizer_switch='index_condition_pushdown=off';
Query OK, 0 rows affected

mysql> explain select * from indexConditionPushDown where name like "陈%" and age =20;
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-------------+
| id | select_type | table                  | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra       |
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | indexConditionPushDown | NULL       | range | multi_name_age | multi_name_age | 771     | NULL |    1 |    33.33 | Using where |
+----+-------------+------------------------+------------+-------+----------------+----------------+---------+------+------+----------+-------------+
1 row in set

结论 【Extra】

  1. ICP版本为 Using index condition
  2. 禁用后未 Using where

说明

索引下推(Index Condition Pushdown)是MySQL数据库的一种优化技术,它可以将部分查询条件下推至存储引擎层面进行处理,从而减少需要返回给MySQL服务器层面的数据量,提高查询性能。

具体来说,当MySQL服务器执行查询语句时,优化器会根据查询条件选择适当的索引进行查询。如果使用的是覆盖索引(Covering Index),也就是索引包含了所有需要查询的列,那么查询结果可以直接从索引中返回,不需要再到数据表中查找。但如果索引只包含了部分需要查询的列,或者需要在数据表中查找满足条件的数据行,那么查询就需要进行两次访问:首先访问索引,找到符合条件的主键或行号,然后再到数据表中查找相应的数据行。

为了减少这种两次访问的开销,MySQL引入了索引下推技术。具体来说,当优化器选择使用索引进行查询时,它会将查询条件分为两类:一类是可以直接在索引中判断的条件,比如等值查询、范围查询等;另一类是需要在数据表中判断的条件,比如包含了函数、表达式、子查询等。优化器会将第一类条件下推至存储引擎层面进行处理,而不是等待到数据表层面再进行判断。这样可以减少需要返回给MySQL服务器层面的数据量,提高查询性能。

参考链接


牙小木木
1.5k 声望80 粉丝

iamtb.cn


引用和评论

0 条评论