MySql索引下推知识分享

news2024/11/16 22:23:35

作者:刘邓忠

Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础知识,如有错误,还请各位大佬们指正。

1 什么是索引下推

索引下推 (Index Condition Pushdown,索引条件下推,简称 ICP),是 MySQL5.6 版本的新特性,它可以在对联合索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,能有效的减少回表次数(目前我们使用的 mysql 版本较高,一般大家可能感觉这是正常的,但是 mysql5.6 之前都不是这样实现的,下面会细细道来)。

1.1 适用条件

我们先来了解一下索引下推的使用条件及限制:

  • 只支持 select。
  • 当需要访问全表时,ICP 用于 range,ref,eq_ref 和 ref_or_null 访问类型。
  • ICP 可用于 InnoDB 和 MyISAM 表,包括分区的 InnoDB 和 MyISAM 表。(5.6 版本不适用分区表查询,5.7 版本后可以用于分区表查询)。
  • 对于 InnDB 引擎只适用于二级索引(也叫辅助索引),因为 InnDB 的聚簇索引会将整行数据读到 InnDB 的缓冲区,这样一来索引条件下推的主要目的减少 IO 次数就失去了意义。因为数据已经在内存中了,不再需要去读取了。
  • 在虚拟生成列上创建的辅助索引不支持 ICP(注:InnoDB 支持虚拟生成列的辅助索引)。
  • 使用了子查询的条件无法下推。
  • 使用存储过程或函数的条件无法下推(因为因为存储引擎没有调用存储过程或函数的能力)。
  • 触发条件无法下推。(有关触发条件的信息,请参阅官方资料:Section 8.2.2.3, “Optimizing Subqueries with the EXISTS Strategy”.。)

1.2 原理介绍

首先,我们大致回顾下 mysql 的基本架构:

MySQL 基本的架构示例图



MySQL 服务层主要负责 SQL 语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和查询。
索引下推的下推其含义就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
在 MySql 5.6 版本之前没有索引下推这个功能,从 5.6 版本后才加上了这个优化项。我们先简单对比一下使用和未使用 ICP 两种情况下,MySql 的查询过程吧。

1) 未使用 ICP 的情况下:

- 存储引擎读取索引记录;
- 根据索引中的主键值,定位并读取完整的行记录;
- 存储引擎把记录交给 Server 层去检测该记录是否满足 WHERE 条件。

2) 使用 ICP 的情况下:

- 存储引擎读取索引记录(不是完整的行记录);
- 判断 WHERE 条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引记录;
- 条件满足,使用索引中的主键去定位并读取完整的行记录(就是所谓的回表);
- 存储引擎把记录交给 Server 层,Server 层检测该记录是否满足 WHERE 条件的其余部分。

2 具体示例


上面介绍了基本原理,下面使用示例,带大家更直观的进行理解(注:以下示例基于 InnoDB 存储引擎。)
首先,我们新建一张用户表(jxc_user),设置 id 为主键索引,并创建联合索引(name, age)。
 



我们先看一下该表主键索引的大致结构示例:

主键索引结构示例图



然后我们再看一下该表联合索引的大致结构示例:

联合索引结构示例图


如果现在有一个需求,要求检索出表中名字第一个字是张,而且年龄等于 10 岁的所有用户。示例 SQL 语句如下:

 select id,name,age,tel,addr from jxc_user where name like '张%' and age=10;

根据索引最左匹配原则,上面这个 sql 语句在查索引树的时候,只能用 “张”,查到第一个满足条件的记录:id 为 1。
那接下来我们具体看一下 使用与未使用 ICP 的情况。

2.1 未使用 ICP 的情况

在 MySQL 5.6 之前,存储引擎根据联合索引先找到 name like ‘张 %’ 的主键 id(1、4),再逐一进行回表扫描,去聚簇索引找到完整的行记录,返回 server 层,server 层拿到数据后,再根据条件 age=10 对拿到的数据进行筛选。大致的示意图如下:

从上图,可以看到需要回表两次,存储引擎并不会去按照 age=10 进行过滤,相当于联合索引的另一个字段 age 在存储引擎层没有发挥作用,比较浪费。

2.2 使用 ICP 的情况

而 MySQL 5.6 以后, 存储引擎会根据(name,age)联合索引,找到 name like ‘张 %’,由于联合索引中包含 age 列,所以存储引擎直接再联合索引里按照条件 age=10 进行过滤,然后根据过滤后的数据再依次进行回表扫描。大致的示意图如下:

从上图,可以看到只是 id=1 的数据,回表了一次。

除此之外我们还可以看一下执行计划,看到 Extra 一列里 Using index condition,就是用到了索引下推。

3 控制参数

Mysql 索引下推功能默认是开启的,可以用系统参数 optimizer_switch 来控制是否开启。
查看状态命令:
select @@optimizer_switch;

关闭命令:set optimizer_switch=”index_condition_pushdown=off”;
开启命令:set optimizer_switch=”index_condition_pushdown=on”;

4 总结

回表操作:当所要查找的字段不在非主键索引树上时,需要通过叶子节点的主键值去主键索引上获取对应的行数据,这个过程称为回表操作。
索引下推:索引下推主要是减少了不必要的回表操作。对于查找出来的数据,先过滤掉不符合条件的,其余的再去主键索引树上查找。

5 参考文献

  • https://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html
  • http://mysql.taobao.org/monthly/2015/12/08/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术分享 | 测试的本质是什么?

本文将分别浅谈不同阶段的业务、不同端的业务、不同类型的业务的测试差异,再抽离其中的测试目标/本质。仅为笔者个人观点,欢迎批评指正。 一、不同阶段业务对测试的需求不同 不同阶段业务对测试的需求不同。这点几乎经历过的人员都心有戚戚焉。 从0到1的…

盘点导致Spring事务失效的4个场景

1,非运行时异常导致事务无法回滚 我们知道,Spring是通过AOP的方式来实现事务的,而在处理事务的过程中,Spring只有捕获到RuntimeException或者Error的时候才会触发回滚操作,如果我们在代码中抛出的是非运行时异常&…

Web前端学习之虚拟DOM如何进化为真实DOM

Vue和React的Render函数中都涉及到了Virtual DOM的概念,Virtual DOM也是性能优化上的重要一环,同时突破了直接操作真实DOM的瓶颈,本文带着以下几个问题来阐述Virtual DOM。 1.为什么要操作虚拟 DOM? 2.什么是虚拟 DOM? 3.手把手教你实现…

Word内容解析之图表数据获取

最近遇到一个问题,Word里有个从Excel直接复制进去的图,但那个Excel已经找不到了,无法通过编辑数据获取到表格的数据。这个其实可以用getdata等软件获取,或者鼠标点在表上的点就可以显示数据,再把数据录下来&#xff0c…

更加灵活、经济、高效的训练 — 新一代搜推广稀疏大模型训练范式GBA

作者:苏文博、张远行 近日,阿里巴巴在国际顶级机器学习会议NeurIPS 2022上发表了新的自研训练模式 Gloabl Batch gradients Aggregation(GBA,论文链接:https://arxiv.org/abs/2205.11048),由阿里…

模拟电子技术(七)波形的发生和信号的转换

(七)波形的发生和信号的转换正弦波振荡电路RC正弦波振荡电路LC正弦波振荡电路正弦波振荡例题电压比较器单限比较器过零比较器一般单限比较器滞回比较器窗口比较器电压比较器例题非正弦波发生电路矩形波发生电路三角波发生电路锯齿波发生电路信号转换电路…

Visual Studio 调试无法启动调试,拒绝访问

方法一 win更新了不兼容 ,卸载更新。 1、单击开始菜单,选择【设置】如下图; 2、然后再进入【更新和安全】选项,如下图; 3、查看已安装更新历史记录,如下图红圈 4、这个页面详细列出了最新的更新&#xf…

绿盟SecXOps安全智能分析技术白皮书 安全分析模型核心服务部署

安全分析模型核心服务部署 ModelOps 对所有的人工智能 模型(图形模型、语言模型、基于规则的模型)以及决策模型的整个生命周期 进行管理,确保对生产中的所有模型进行独立验证和问责,其核心功能涵盖了模型存储、模型测试、模型回滚…

28. 如何使用 SAP OData 服务向 ABAP 服务器上传文件

文章目录 1. 创建对应的自定义数据库表和 ABAP DDIC 结构2. 完成 SEGW 事物码里模型的增强3. 完成必要的 ABAP 编码本教程到目前为止开发的 OData 图书管理服务,可以在 ABAP 系统里对图书数据进行增删改查。 本步骤我们继续介绍如何通过 SAP OData 服务,实现向 ABAP 系统上传…

0.96寸OLED显示屏介绍

OLED显示屏简介 OLED,即有机发光二极管(Organic Light Emitting Diode)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性&#x…

【C语言】常见字符函数和字符串函数

1.1strlen size_t strlen(const char* str); 字符串已经\0作为结束标志,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)。 参数指向的字符串必须以\0结束。 注意函数的返回值为size_t,是无符号整形(…

五、Vector底层源码详解

文章目录特点底层源码分析有参构造器public Vector(int initialCapacity, int capacityIncrement)有参构造器public Vector(int initialCapacity)有参构造器public Vector(Collection<? extends E> c)无参构造器public Vector()扩容机制特点 底层是elementDate数组线程…

自学Python真的可以吗?

自学当然可以学成功python了&#xff0c;但是前提是你需要认真去学&#xff0c;而不是三天打渔两天晒网的&#xff0c;因为python初学很容易&#xff0c;稍微过几天忘记也很容易&#xff0c;所以一定要坚持学习&#xff0c;并且通过平时多加练习来熟练掌握各个知识点。 一、学…

非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc)

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.4 注释文档(doc)第15章 Go命令行工具 15.4 注释文档(doc) Go语言文档工具go doc和go fmt一样&#xff0c;也是对godoc的简单封装。 我们通常使用go doc查看指定包的文档。 例如我们查看函数fmt.Println…

焕然一新的 Vue 3 中文文档要来了

前言 大家好&#xff0c;我是LBJ&#xff0c;最近参与了 Vue 3新文档的翻译和校验工作 (vuejs/docs contributor 和 docs-zh-cn contributor) 我们知道 Vue 3 新文档 ( vuejs.org ) 已经发布一个多月了&#xff0c;但那是英文版的&#xff0c;不知道你看了没&#xff1f; 没…

恒业微晶冲刺深交所:年营收4.3亿 戴联平控制73.8%表决权

雷递网 雷建平 12月20日上海恒业微晶材料科技股份有限公司&#xff08;简称&#xff1a;“恒业微晶”&#xff09;日前递交招股书&#xff0c;准备在深交所创业板上市。恒业微晶计划募资8亿元&#xff0c;用于恒业新型分子筛项目。年营收4.31亿恒业微晶创建于1992年&#xff0c…

Vue3 Proxy代理为什么要用 Reflect映射

瞅一眼Vue3源码 地址&#xff1a;https://github.com/vuejs/core/blob/main/packages/reactivity/src/baseHandlers.ts 可以看到Proxy响应式代理 依赖 createGetter与createSetter方法&#xff1a; &#x1f6a5; createGetter function createGetter(isReadonly false, s…

Go并发大坑:inconsistent mutex state 解决及心得体会

文章目录前言首次排查&#xff08;未重视&#xff09;问题逐渐严重加大排查力度增加锁日志race detector一次意外的复现写在最后解决问题所必需的品格前言 大概在这篇文章发布数个月之前&#xff0c;某天&#xff0c;线上稳定运行的Go服务突然毫无征兆的发生了一次重启&#x…

MyBatis的相应API与传统和代理开发的Dao层实现

MyBatis的相应API 1、SqlSession工厂构建器SqlSessionFactoryBuilder 常用API&#xff1a;SqlSessionFactory build(InputStream inputStream) 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象 其中&#xff0c;mybatis-config.xml是类加载器的路径&…

为什么要学编程?为什么是Python?怎么学?

今天我们聊了为什么要去学编程&#xff0c;学编程为什么要选择Python。上大学的时候我学的信息管理&#xff0c;毕业后选择了和网络相关的网络安全公司做售后。 从上学的时候自己就想过去学学编程&#xff0c;感觉他们敲代码都敲的那么酷&#xff0c;看着满屏的代码还有命令行…