SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序
MySql索引下推学问
Mysql是最常用的数据库。这里就分享一下mysql索引下推的学问点,以此来稳固mysql的根底学问。如有错误,请指正。
1什么是指数下推?
索引条件下推(ICP)是mysql版本5.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支持虚拟生成列的二级索引)。
不能下推运用子查询的条件。
运用存储过程或函数的条件不能下推(由于存储引擎没有才能调用存储过程或函数)。
不能按下触发条件。(有关触发条件的信息,请参考官方数据:8.2.2.3局部,“用现有战略优化查询”)。)
1.2原理引见
首先,让我们简单回忆一下mysql的根本架构:
根本MySQL架构的示例图
MySQL效劳层主要担任解析SQL语法,生成执行方案等。,并调用存储引擎层来存储和查询数据。
索引下推的意义就是把上层(效劳层)担任的一些事情交给下层(引擎层)处置。
MySQL版之前没有索引下推功用,5.6版之后才增加了这个优化项。我们先简单比照一下MySql有ICP和没有ICP的查询过程。
1)没有ICP:
存储引擎读取索引记载;
依据索引中的主键值,定位并读取完好的行记载;
存储引擎将记载发送到效劳器层,以检查记载能否满足WHERE条件。
2)当运用ICP时:
存储引擎读取索引记载(不是完好的行记载);
判别WHERE条件局部能否能够被索引中的列检查到,假如不满足条件,则处置下一行索引记载;
当条件满足时,运用索引中的主键定位并读取完好的行记载(即所谓的返回表);
存储引擎将记载交给效劳器层,效劳器层检查记载能否满足WHERE条件的其他局部。
2个详细例子
上面引见了根本原理,下面的例子是用来让你更直观的了解(注:下面的例子是基于InnoDB存储引擎的。)
首先,我们创立一个新的用户表(jxc_user),将id设置为主键索引,并创立一个结合索引(name,age)。
然后我们来看看这个表的结合索引的大致构造。
结合索引构造示例图
如今,假如有需求,则需求检索表中名字为张且年龄等于10岁的一切用户。示例SQL语句如下:
Select,name,age,tel,addr from jxc _ user其中name like' sheets % ',age = 10
依据索引最左匹配准绳,上述sql语句在搜索索引树时只能运用“张”,找到第一条满足条件的记载:id为1。
那么我们来看看运用ICP和不运用ICP的状况。
2.1不运用国际比拟计划的状况
在MySQL 5.6之前,存储引擎首先依据结合索引找到Namelike' Zhang% '的主键id(1,4),然后逐一扫描回表,去聚类索引找到完好的行记载,返回给效劳器层。效劳器层获取数据后,依据条件age=10对获取的数据停止过滤。的表示图如下:
能够看出,表需求返回两次,存储引擎不会依照age=10停止过滤,相当于结合索引的另一个字段age在存储引擎层没有发挥作用,比拟糜费。
2.2国际比拟计划的运用
MySQL 5.6以后,存储引擎会依据(姓名,年龄)结合索引找到相似'张% '这样的名字。由于结合索引包含age列,所以存储引擎直接依据age=10的条件挑选结合索引,然后依据挑选的数据回扫表。的表示图如下:
能够看到id=1的数据被返回到表中一次。
此外,我们还能够查看执行方案,看到在额外的列中运用索引条件是索引下推。
3个控制参数
Mysql索引下推功用默许开启,能够经过系统参数optimizer_switch控制。
查看状态命令:
select @ @ optimizer _ switch
命令:set optimizer _ switch = " index _ condition _ pushdown = off ";
命令:set optimizer _ switch = " index _ condition _ pushdown = on ";
4摘要
回表操作:当要查找的字段不在非主键索引树上时,需求到叶节点的主键索引上获取对应的行数据。这个过程称为返回表操作。
索引下推:索引下推主要是减少不用要的表返回操作。关于找到的数据,先过滤掉不合格的数据,再去主键索引树找剩下的。
SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序
download:链接:https://pan.baidu.com/s/1RPR883WxDqJl5k_T6mVKHw?pwd=fy65
提取码:fy65
--来自百度网盘超级会员V5的分享