索引下推 你不得不知的 MySQL 查询优化技术

前言

  • 大家好,我是 Lorin ,今天给大家带来 MySQL 查询性能优化的另一个重要优化技术:索引下推。
  • 索引下推(Index Condition Pushdown,简称ICP),是 MySQL5.6 版本提供的新特性,核心目标是减少回表查询次数,提高查询效率。

索引下推原理

MySQL 基础架构

  • 在了解索引下推前,我们先简单回忆一下MySQL 基础架构:
  • 索引下推本质上是将服务层的的工作下推到存储引擎,从而减少回表的次数,我们来看一下传统查询过程和ICP查询过程的区别:
  • 假设我们有如下 TABLE 和 SQL 查询语句:
sql 复制代码
CREATE TABLE `tuser` (
  `id` int(11) NOT NULL,
  `id_card` varchar(32) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `ismale` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id_card` (`id_card`),
  KEY `name_age` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

EXPLAIN select * from tuser where name like '李%' and age=11;

传统查询过程

  • 存储引擎根据 merchant_id > 3 查询出所有符合的数据列,根据数据列对应主键 ID 回表查询,并返回 Service 层。
  • Service 层根据 order_id = "2" 筛选符合条件的数据返回客户端。

ICP 查询过程

  • 存储引擎根据 merchant_id > 3 查询出所有符合的数据列,由于使用的是联合索引,数据列中包含 order_id 的值,存储引擎再根据 order_id = "2" 过滤出符合条件的数据列,根据数据列对应主键 ID 回表查询,并返回 Service 层。
  • 可以看到使用 ICP 的方式减少了我们回表查询次数,但索引下推在某些情况下可能并不总是生效,具体取决于优化器的决策。

使用场景限制

  • 适用于range、ref、eq_ref和ref_or_null查询
  • InnoDB和MyISAM都支持,Mysql partition分表也可以使用
  • 对于InndoDB而言,ICP只支持二级索引,主键不需要回表
  • 子查询不支持

参数配置

索引下推开启状态查询

sql 复制代码
SHOW VARIABLES LIKE 'optimizer_switch';

// 默认开启
index_condition_pushdown=on

索引下推开启和关闭

sql 复制代码
set optimizer_switch="index_condition_pushdown=off";
set optimizer_switch="index_condition_pushdown=on";

一些问题

只有联合索引才能使用索引下推?

  • 是的,需要联合索引中无法生效的索引字段列进行过滤,从而减少回表查询。
  • 注意:Using index condition 不代表一定使用了索引下推,所以一定要注意,比如下面的例子:
sql 复制代码
EXPLAIN select * from tuser where name like '李%' and id_card > "1111";
  • 虽然 Extra 中有 Using index condition ,但是并没有使用索引下推,只是可能使用。

下面的查询为什么不走索引下推

sql 复制代码
EXPLAIN select * from tuser where name > '李%' and age=11;
  • 可以看到查询计划选择了全表扫描,所以无法运用索引下推。

参考

相关推荐
hqxstudying12 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·20 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
KellenKellenHao29 分钟前
MySQL数据库主从复制
数据库·mysql
martinzh1 小时前
Spring AI 项目介绍
后端
Bug退退退1231 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
前端付豪1 小时前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python
爱学习的小学渣1 小时前
关系型数据库
后端
武子康2 小时前
大数据-33 HBase 整体架构 HMaster HRegion
大数据·后端·hbase
前端付豪2 小时前
19、用 Python + OpenAI 构建一个命令行 AI 问答助手
后端·python