首页 > 数据库 >MySQL查询性能优化七种武器之索引下推

MySQL查询性能优化七种武器之索引下推

时间:2022-08-25 13:22:07浏览次数:84  
标签:name 七种 下推 查询 索引 MySQL 主键

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

MySQL查询性能优化七种武器之索引潜水

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

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

1. 索引下推的作用

主要作用有两个:

  1. 减少回表查询的次数
  2. 减少存储引擎和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;

image

执行计划中的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层的数据传输量?

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

  1. 存储引擎根据where条件中name索引字段,找到符合条件的3个主键ID
  2. 然后二次回表查询,根据这3个主键ID去主键索引上找到3个整行记录
  3. 把数据返回给MySQL Server层,再根据where中age条件,筛选出符合要求的一行记录
  4. 返回给客户端

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

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

  1. 先在联合索引上找到name=‘一灯’的3个主键ID
  2. 再根据查到3个主键ID,去主键索引上找到3行记录

image

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

image

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

  1. 存储引擎根据where条件中name索引字段,找到符合条件的3行记录,再用age条件筛选出符合条件一个主键ID
  2. 然后二次回表查询,根据这一个主键ID去主键索引上找到该整行记录
  3. 把数据返回给MySQL Server层
  4. 返回给客户端

image

image

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

  1. 减少回表查询的次数
  2. 减少存储引擎和MySQL Server层的数据传输量

索引下推的含义就是,本来在MySQL Server层做的筛选操作,下推到存储引擎层来做。

5. 索引下推应用范围

  1. 适用于InnoDB 引擎和 MyISAM 引擎的查询
  2. 适用于执行计划是range, ref, eq_ref, ref_or_null的范围查询
  3. 对于InnoDB表,仅用于非聚簇索引。索引下推的目标是减少全行读取次数,从而减少 I/O 操作。对于 InnoDB聚集索引,完整的记录已经读入InnoDB 缓冲区。在这种情况下使用索引下推 不会减少 I/O。
  4. 子查询不能使用索引下推
  5. 存储过程不能使用索引下推

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

image

image

标签:name,七种,下推,查询,索引,MySQL,主键
From: https://www.cnblogs.com/yidengjiagou/p/16623966.html

相关文章

  • 详解MySQL隔离级别
    一个事务具有ACID特性,也就是(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),本文主要讲解一下其中的Isolation,也就是事务的隔离性。概......
  • 【mysql_8】
    网址:https://dev.mysql.com/downloads/MySQLCommunityServerLinux-Generic根据自己的系统选择安装包,我这里选择的是X8664位 第一步:1)切换到/usr/local下2......
  • 【索引】Mysql索引常见问题
    1、什么是索引:索引是一种数据结构,用来提高在数据表中的数据查询效率,同时也是随机读和有效排序的基础。2、为什么使用索引:根本原因在于磁盘速度与内存速度差距甚大,所......
  • MySQL-索引
    为什么需要索引?定义:索引是一个列或多个列进行排序的数据结构作用:索引能大幅提高查找效率缺点:创建和更新索引会耗费空间和时间查找结构进化一个个找:实现简单:太慢二分......
  • 统信 UOS Server 20 修改 MySQL 数据目录(datadir)
    一、环境说明操作系统:UnionTechOSServer20Enterprise数据库:MySQL5.7注1:统信UOS查看系统版本方式#方式一,查看发行版信息cat/etc/os-release#方式二,查看......
  • 荧光光度计的七种故障解决方法
    我们在使用原子荧光光度计时有可能会遇到各种故障,那么本篇就为大家分享一些常见的故障及排除方法吧。 一、点火问题在分析工作中,经常会碰到部分仪器点火线圈不......
  • MySQL分区介绍与使用
    一、MySQL分区创建 MySQL创建方式一共有四种:range、list、hash和key。1.range(官方文档)1.1intcreatetablestaff(idint(32)notnull,code_varchar(30),......
  • 学习:python操作mysql(一)
    1、安装mysql,这里我大哥提供给我的是解压版的安装包为了防止自己以后忘了记录一下安装方式第一步将安装包解压到提前准备好的文件夹内  第二步配置环境变量path......
  • mysql8.0.30zip压缩版的下载和安装
    1.首先进入官网下载地址:https://dev.mysql.com/downloads/mysql/ 2.接着选好操作系统,下载上面箭头所示的zip版本。 3.将下载好的压缩包解压出来,我的路径是:F:\mys......
  • MySQL数据库忘记root密码
    在Linux系统中MySQL数据库的root密码忘记后,我们可以通过修改配置文件的方式先跳过密码的方式跳过密码登录MySQL数据库,后在数据库中再进行修改密码。1.修改MySQL配置文......