前置版本
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】
- ICP版本为 Using index condition
- 禁用后未 Using where
说明
索引下推(Index Condition Pushdown)是MySQL数据库的一种优化技术,它可以将部分查询条件下推至存储引擎层面进行处理,从而减少需要返回给MySQL服务器层面的数据量,提高查询性能。
具体来说,当MySQL服务器执行查询语句时,优化器会根据查询条件选择适当的索引进行查询。如果使用的是覆盖索引(Covering Index),也就是索引包含了所有需要查询的列,那么查询结果可以直接从索引中返回,不需要再到数据表中查找。但如果索引只包含了部分需要查询的列,或者需要在数据表中查找满足条件的数据行,那么查询就需要进行两次访问:首先访问索引,找到符合条件的主键或行号,然后再到数据表中查找相应的数据行。
为了减少这种两次访问的开销,MySQL引入了索引下推技术。具体来说,当优化器选择使用索引进行查询时,它会将查询条件分为两类:一类是可以直接在索引中判断的条件,比如等值查询、范围查询等;另一类是需要在数据表中判断的条件,比如包含了函数、表达式、子查询等。优化器会将第一类条件下推至存储引擎层面进行处理,而不是等待到数据表层面再进行判断。这样可以减少需要返回给MySQL服务器层面的数据量,提高查询性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。