索引下推 你不得不知的 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;
  • 可以看到查询计划选择了全表扫描,所以无法运用索引下推。

参考

相关推荐
星球奋斗者4 小时前
计算机方向如何才能更好的找到工作?(成长心得)
java·后端·考研·软件工程·改行学it
Jabes.yang4 小时前
互联网大厂Java面试:缓存技术与监控运维的深度探讨
java·面试指南·缓存技术·监控运维
海梨花4 小时前
【八股笔记】SSM
java·开发语言·笔记·后端·面试·框架
珹洺5 小时前
Java-Spring入门指南(二十五)Android 的历史,认识移动应用和Android 基础知识
android·java·spring
只想码代码5 小时前
什么是程序计数器?
java·jvm
JAVA学习通5 小时前
OJ竞赛平台----C端题目列表
java·开发语言·jvm·vue.js·elasticsearch
IT_陈寒5 小时前
Redis性能翻倍的7个冷门技巧:从P5到P8都在偷偷用的优化策略!
前端·人工智能·后端
间彧5 小时前
Spring Assert与手动if-throw的性能差异具体有多大?是否有基准测试数据?
后端
间彧5 小时前
Spring Assert在性能敏感场景下有哪些具体的优化技巧?
后端
间彧5 小时前
在实际项目中,如何根据具体场景选择使用Spring Assert还是if-throw?
后端