MySQL查询性能优化索引下推

作者:一灯架构??????? 时间:2024-01-24 15:43:01 

前言

前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下:

MySQL查询性能优化七种方式索引潜水

MySQL查询性能优化武器之链路追踪

今天要讲的是MySQL的另一种查询性能优化方式 — 索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本增加的特性。

1. 索引下推的作用

主要作用有两个:

  • 减少回表查询的次数

  • 减少存储引擎和MySQL Server层的数据传输量

总之就是了提升MySQL查询性能。

2. 案例实践

创建一张用户表,造点数据验证一下:

CREATE TABLE `user` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
 `name` varchar(100) NOT NULL COMMENT '姓名',
 `age` tinyint NOT NULL COMMENT '年龄',
 `gender` tinyint NOT NULL COMMENT '性别',
 PRIMARY KEY (`id`),
 KEY `idx_name_age` (`name`,`age`)
) ENGINE=InnoDB COMMENT='用户表';

在 姓名和年龄 (name,age) 两个字段上创建联合索引。

查询SQL执行计划,验证一下是否用到索引下推

explain select * from user where name='一灯' and age>2;

MySQL查询性能优化索引下推

执行计划中的Extra列显示了Using index condition,表示用到了索引下推的优化逻辑。

3. 索引下推配置

查看索引下推的配置:

show variables like '%optimizer_switch%';

如果输出结果中,显示 index_condition_pushdown=on,表示开启了索引下推

也可以手动开启索引下推:

set optimizer_switch="index_condition_pushdown=on";

关闭索引下推

set optimizer_switch="index_condition_pushdown=off";

4. 索引下推原理剖析

索引下推在底层到底是怎么实现的?

是怎么减少了回表的次数?

又减少了存储引擎和MySQL Server层的数据传输量?

在没有使用索引下推的情况,查询过程是这样的:

  • 存储引擎根据where条件中name索引字段,找到符合条件的3个主键ID

  • 然后二次回表查询,根据这3个主键ID去主键索引上找到3个整行记录

  • 把数据返回给MySQL Server层,再根据where中age条件,筛选出符合要求的一行记录

  • 返回给客户端

画两张图,就一目了然了。

下面这张图是回表查询的过程:

  • 先在联合索引上找到name=‘一灯’的3个主键ID

  • 再根据查到3个主键ID,去主键索引上找到3行记录

MySQL查询性能优化索引下推

下面这张图是存储引擎返回给MySQL Server端的处理过程:

MySQL查询性能优化索引下推

我们再看一下在使用索引下推的情况,查询过程是这样的:

  • 存储引擎根据where条件中name索引字段,找到符合条件的3行记录,再用age条件筛选出符合条件一个主键ID

  • 然后二次回表查询,根据这一个主键ID去主键索引上找到该整行记录

  • 把数据返回给MySQL Server层

  • 返回给客户端

MySQL查询性能优化索引下推

MySQL查询性能优化索引下推

现在是不是理解了索引下推的两个作用:

  • 减少回表查询的次数

  • 减少存储引擎和MySQL Server层的数据传输量

5. 索引下推应用范围

  • 适用于InnoDB 引擎和 MyISAM 引擎的查询

  • 适用于执行计划是range, ref, eq_ref, ref_or_null的范围查询

  • 对于InnoDB表,仅用于非聚簇索引。索引下推的目标是减少全行读取次数,从而减少 I/O 操作。对于 InnoDB聚集索引,完整的记录已经读入InnoDB 缓冲区。在这种情况下使用索引下推 不会减少 I/O。

  • 子查询不能使用索引下推

  • 存储过程不能使用索引下推

再附一张Explain执行计划详解图:

MySQL查询性能优化索引下推

来源:https://juejin.cn/post/7129870429090480142

标签:MySQL,查询,性能,优化,索引,下推
0
投稿

猜你喜欢

  • 简单聊一聊SQL中的union和union all

    2024-01-18 00:17:17
  • 对Python中range()函数和list的比较

    2021-08-26 14:59:47
  • PHP实现登录注册之BootStrap表单功能

    2024-05-11 09:07:25
  • Pycharm在指定目录下生成文件和删除文件的实现

    2022-04-12 20:00:28
  • Go语言通过WaitGroup实现控制并发的示例详解

    2023-06-29 01:04:27
  • Pandas的AB BA类型数据框去重复

    2022-09-26 07:48:16
  • MySQL查询缓存优化示例详析

    2024-01-27 12:21:32
  • Pandas 缺失数据处理的实现

    2023-07-14 05:57:38
  • 教你如何在pycharm中使用less

    2021-08-12 13:59:32
  • python中requests库session对象的妙用详解

    2021-10-30 14:42:58
  • python使用pandas处理excel文件转为csv文件的方法示例

    2021-09-13 07:15:52
  • Python自动生成代码 使用tkinter图形化操作并生成代码框架

    2021-04-26 08:47:30
  • 解读SQL语句中要不要加单引号的问题

    2024-01-21 06:46:04
  • PyQt5每天必学之拖放事件

    2021-02-28 19:26:15
  • Python 微信爬虫完整实例【单线程与多线程】

    2023-08-19 23:12:58
  • python神经网络特征金字塔FPN原理

    2023-12-20 02:21:01
  • python神经网络学习利用PyTorch进行回归运算

    2023-02-24 13:30:47
  • 浅析Python 抽象工厂模式的优缺点

    2021-08-12 01:33:17
  • Linux下使用Jenkins自动化构建.NET Core应用

    2024-05-13 09:16:36
  • 详解Golang 与python中的字符串反转

    2021-08-01 23:31:08
  • asp之家 网络编程 m.aspxhome.com