MySQL索引下推讲解

一、什么是索引下推

  • 索引条件下推(Index Condition Pushdown,ICP)是MySQL 5.6版本后引入的一项新特性。它通过减少回表的次数来提高数据库的查询效率。

  • 在不使用ICP的情况下,当使用非主键索引(也称为普通索引或二级索引)进行查询时,存储引擎会通过索引检索到数据,然后将数据返回给MySQL服务器,服务器再判断数据是否符合查询条件。

  • 而在使用ICP的情况下,如果查询语句中存在某些索引列的判断条件,MySQL服务器将这部分条件传递给存储引擎。存储引擎会根据这些条件判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时,存储引擎才会将数据检索出来并返回给MySQL服务器。

  • 通过使用ICP,数据库可以在存储引擎层级对索引进行条件判断,减少不必要的回表操作,从而提高查询效率。这样可以大大减少从磁盘读取数据的次数,加快查询速度。

  • 需要注意的是,ICP的效果取决于具体的查询语句和索引的使用情况。并不是所有的查询都适合使用ICP,有时可能会导致性能下降。因此,在使用ICP时需要进行合理的测试和评估,确保其能够带来性能的提升。

二、MySQL架构图

mysql

三、DEMO演示过程

MySQL版本如下:

SELECT VERSION();

在这里插入图片描述

下面是创建一个名为user的表,并插入一些测试数据的SQL语句:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(64) NOT NULL COMMENT '用户名',
  `age` int(8) NOT NULL COMMENT '年龄',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `is_delete` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除,默认否',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age` (`name`, `age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO t_user(name, age, address) VALUES ('李四', 22, '中国');
INSERT INTO t_user(name, age, address) VALUES ('李五', 22, '中国');
INSERT INTO t_user(name, age, address) VALUES ('李六', 23, '中国');
INSERT INTO t_user(name, age, address) VALUES ('张三', 24, '中国');
INSERT INTO t_user(name, age, address) VALUES ('李期', 24, '中国');

在Navicat上执行上述SQL如下:

在这里插入图片描述
插入测试数据:

在这里插入图片描述

接下来,我们创建一个联合索引来测试索引下推的场景:

CREATE INDEX idx_user_name_age ON user (name, age);

然后,我们可以使用EXPLAIN语句来演示索引下推的效果:

EXPLAIN SELECT * FROM t_user WHERE name LIKE '李%' AND age = 22;

执行以上语句后,输出的结果中,可以观察到Extra列中有一个"Using index"的标记,表示索引下推被成功应用。

在这里插入图片描述

总结下SQL执行过程:

  1. 解析SQL语句,确定查询的表和条件。
  2. 根据查询条件选择合适的索引,如果存在适用的联合索引,会优先选择联合索引。
  3. 使用索引检索数据,将满足条件的索引行找出来。
  4. 将索引行传递给MySQL服务器。
  5. MySQL服务器根据剩余的条件进行判断,只有满足所有条件的索引行才会被返回。
  6. 返回结果给客户端。

在使用索引下推的场景下,步骤4中的索引行会根据剩余的条件进行判断,只有满足条件的索引行才会被返回给MySQL服务器,从而减少了不必要的数据传输和判断操作,提高了查询效率。

💎索引下推💎 是 mysql 5.6 优化查询回表的功能,在5.6之前都不支持索引下推,我这里使用的是8.0

关闭索引下推:

SET SESSION optimizer_switch='index_condition_pushdown=off';

再次执行:EXPLAIN SELECT * FROM t_user WHERE name LIKE ‘李%’ AND age = 22;

using where

  • 具体来说,Using where表示查询执行时需要在查询引擎层级使用WHERE子句对结果进行过滤。这意味着在查询执行期间,MySQL将扫描表中的每一行,并根据WHERE条件进行过滤,以返回满足条件的结果集。

  • 当Using where出现在EXPLAIN执行结果的Extra列时,表示查询过程中需要在查询引擎层级(Server层)执行额外的过滤操作,可能会导致查询性能下降。

  • 相比之下,如果EXPLAIN执行结果中出现了Using index condition,那么意味着查询过程中已经使用了索引下推(index condition pushdown),即查询条件已经在存储引擎层级进行了过滤,不需要在查询引擎层级再进行过滤操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL索引是一种数据结构,用于提高数据库的性能。它似于书籍的索引,可以帮助快速定位到特定的数据记录。 当你在数据库表中创建一个索引时,MySQL会为该列(或多列)创建一个数据结构,该结构包含索引键和指向实际数据行的指针。这样,在查询时,MySQL可以使用索引来快速定位到匹配特定条件的数据行,而不需要遍历整个表。 要讲解MySQL索引,可以按照以下步骤: 1. 确定哪些列需要创建索引:通常,你会在经常用作查询条件的列上创建索引。例如,经常用于WHERE或JOIN语句的列,或者经常用于排序和分组的列。 2. 选择合适的索引类型:MySQL支持多种索引类型,如B树索引、哈希索引、全文索引等。你需要根据具体需求选择合适的索引类型。 3. 创建索引:使用CREATE INDEX语句在表上创建索引。例如,创建一个名为idx_name的B树索引:`CREATE INDEX idx_name ON table_name (column_name);` 4. 了解索引使用的原则:索引并非越多越好,因为每个索引都需要占用存储空间,并且在插入、更新和删除操作时会有一定的性能损耗。因此,需要权衡索引的数量和性能影响。 5. 监控和优化索引:定期检查索引的使用情况,根据实际情况进行调整和优化。可以使用EXPLAIN语句来分析查询计划,查看是否正确使用了索引。 总之,MySQL索引可以显著提高查询性能,但需要根据具体情况来选择和使用索引,并进行适当的监控和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Run,boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值