首页 > 其他分享 >什么是索引下推?

什么是索引下推?

时间:2024-03-13 13:44:33浏览次数:22  
标签:存储 什么 下推 查询 索引 引擎 MySQL

什么是索引下推

索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,用于优化数据查询。

不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件。

当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器。

索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数。

换句话说:索引下推能减少回表查询次数,提高查询效率。

索引下推优化的原理


我们先简单了解一下MySQL大概的架构:

 

 


MySQL从上至下分为以下几层:

  • MySQL服务层:包括NoSQL和SQL接口、查询解析器、优化器、缓存和Buffer等组件。

  • 存储引擎层:各种插件式的表格存储引擎,实现事务、索引等各种存储引擎相关的特性。

  • 文件系统层: 读写物理文件。


MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。
索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
我们来具体看一下,在没有使用ICP的情况下,MySQL的查询:
  • 获取下一行,首先读取索引信息,然后根据索引将整行数据读取出来。

  • 然后通过where条件判断当前数据是否符合条件,符合返回数据。


使用ICP的情况下,查询过程:
  • 获取下一行的索引信息。

  • 检查索引中存储的列信息是否符合索引条件,如果符合将整行数据读取出来,如果不符合跳过读取下一行。

  • 用剩余的判断条件,判断此行数据是否符合要求,符合要求返回数据。

     

索引下推适用条件

 

  • 需要整表扫描的情况。比如:range, ref, eq_ref, ref_or_null 。

  • 适用于InnoDB 引擎和 MyISAM 引擎的查询。(5.6版本不适用分区表查询,5.7版本后可以用于分区表查询)。

  • 对于InnDB引擎只适用于二级索引,因为InnDB的聚簇索引会将整行数据读到InnDB的缓冲区,这样一来索引条件下推的主要目的减少IO次数就失去了意义。因为数据已经在内存中了,不再需要去读取了。

  • 引用子查询的条件不能下推。

  • 调用存储过程的条件不能下推,存储引擎无法调用位于MySQL服务器中的存储过程。

  • 触发条件不能下推。


EXPLAN分析

 

当使用explan进行分析时,如果使用了索引条件下推,Extra会显示Using index condition。并不是Using index。
因为并不能确定利用索引条件下推查询出的数据就是符合要求的数据,还需要通过其他的查询条件来判断。
索引下推的具体实践
理论比较抽象,我们来上一个实践。使用一张用户表tuser,表里创建联合索引(name, age)。

 

 


如果现在有一个需求:检索出表中名字第一个字是张,而且年龄是10岁的所有用户。那么,SQL语句是这么写的:
select * from tuser where name like '张%' and age=10;


假如你了解索引最左匹配原则,那么就知道这个语句在搜索索引树的时候,只能用 张,找到的第一个满足条件的记录id为1。

 

 


那接下来的步骤是什么呢?

没有使用ICP


在MySQL 5.6之前,存储引擎根据通过联合索引找到name likelike '张%' 的主键id(1、4),逐一进行回表扫描,去聚簇索引找到完整的行记录,server层再对数据根据age=10进行筛选。
我们看一下示意图:

 

 


可以看到需要回表两次,把我们联合索引的另一个字段age浪费了。

使用ICP


而MySQL 5.6 以后, 存储引擎根据(name,age)联合索引,找到,由于联合索引中包含列,所以存储引擎直接再联合索引里按照age=10过滤。按照过滤后的数据再一一进行回表扫描。
我们看一下示意图:

 

 

可以看到只回表了一次。
除此之外我们还可以看一下执行计划,看到Extra一列里 Using index condition,这就是用到了索引下推。
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | tuser | NULL | range | na_index | na_index | 102 | NULL | 2 | 25.00 | Using index condition |

 

相关系统参数


索引条件下推默认是开启的,可以使用系统参数optimizer_switch来控制器是否开启。
查看默认状态:

 

切换状态:
set ="index_condition_pushdown=off";
set ="index_condition_pushdown=on";

思考

 

索引下推优化技术其实就是充分利用了索引中的数据,尽量在查询出整行数据之前过滤掉无效的数据。

由于需要存储引擎将索引中的数据与条件进行判断,所以这个技术是基于存储引擎的,只有特定引擎可以使用。并且判断条件需要是在存储引擎这个层面可以进行的操作才可以,比如调用存储过程的条件就不可以,因为存储引擎没有调用存储过程的能力。

 

参考:

1、《 MySQL技术内幕  InnoDB存储引擎》

2、《MySQL实战45讲》

标签:存储,什么,下推,查询,索引,引擎,MySQL
From: https://www.cnblogs.com/shujuyr/p/18070433

相关文章

  • MySQL3种指定索引的方式
    在使用MySQL进行查询时,我们经常会遇到SQL执行没有按照我们预想的那样去使用某个索引优化查询,那怎么解决这个问题呢?对于这个问题,MySQL给我们准备了三个方法,这三个方法可以帮助我们让SQL执行按照我们预想的那样去选择索引。今天我们就针对这三个方法分别来说说吧!useindex:在你查......
  • mysql索引详解
    一、介绍索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数......
  • 索引
    索引是数据库中的一种数据结构,用于加快数据库查询的性能聚集索引和非聚集聚集索引InnoDB(AfterMysql5.5)就是聚集索引,InnoDB的所有搜索操作都会在主键索引构成的B+树上展开,如果没有主键那么就会选择一个Unique约束的字段作为索引,如果也没有,则会默认设置一个DB_ROW_ID作......
  • 什么是PLC设备数据采集?
    在当今工业4.0和智能制造的大背景下,数据的价值日益凸显。特别是对于PLC(可编程逻辑控制器)这类核心工业设备,数据采集显得尤为重要。那么,究竟什么是PLC设备数据采集?它又有何价值呢?今天,就让我们通过介绍HiWooBox,一款卓越的PLC设备数据采集工具,来为您揭开这层面纱。一、PLC设备......
  • 什么是PLC远程控制模块?
    随着工业自动化的不断发展,可编程逻辑控制器(PLC)已成为现代工业设备中不可或缺的核心组件。然而,传统的PLC管理方式往往受限于现场操作和维护,难以满足日益复杂的工业需求。在这一背景下,PLC远程控制模块应运而生,为工业设备的远程管理带来了革命性的变革。今天,我们就来深入探讨一......
  • 为什么defineProps宏函数不需要从vue中import导入?
    前言我们每天写vue代码时都在用defineProps,但是你有没有思考过下面这些问题。为什么defineProps不需要import导入?为什么不能在非setup顶层使用defineProps?defineProps是如何将声明的props自动暴露给模板?举几个例子我们来看几个例子,分别对应上面的几个问题。先来看一个正常的......
  • 什么是Elasticsearch?
     介绍  当人们问“什么是Elasticsearch?”时,有些人可能会回答说它是“一个索引”,“一个搜索引擎”,“分析数据库”,“一个大数据解决方案”,“它快速且可扩展”,或者“它有点像谷歌”。根据您对这项技术的熟悉程度,这些答案可能会使您更接近啊哈时刻,或者让您进一步困惑。但事......
  • 【Mysql】事务与索引
    目录MySQL事务事务的特性并发事务的问题?事务隔离级别?MySQL索引数据结构索引类型聚簇索引与非聚簇索引聚集索引的优点聚集索引的缺点非聚集索引的优点非聚集索引的缺点非聚集索引一定回表查询吗(覆盖索引)?覆盖索引联合索引最左前缀匹配原则创建索引的注意事......
  • 为什么要有包装类?
    1、典型回答在Java中,所有的基本类型都会对应一个包装类,如下所示:之所以要有包装类型的主要原因有以下几个:面向对象要求:Java是一门面向对象的编程语言,要求所有的数据都应该是对象。但是,基本数据类型(如int、char、double等)并不是对象,它们没有成员方法和其他面向对象的特性......
  • 太阳能光伏储能系统是什么意思?有什么用处?
    太阳能光伏储能系统,简称光伏储能系统,是一个将太阳能转化为电能,并储存起来以备后续使用的系统。这个系统主要包括光伏发电部分(即太阳能板)和储能部分(如电池或储能装置)。光伏发电部分通过太阳能板捕获太阳光,将光能转化为直流电。这些直流电随后可以通过逆变器转换为交流电,供我们......