通过前面的两节,很容易简单地理解Mysql索引到底是干什么用的,不过这里说的回表、最左匹配、索引下推又是什么呢?
1.我们都知道Mysql索引对数据库的查询有很重要的位置,通过通过索引很快的查找到需要的数据,通过Mysql的索引分为两种:一种是主键索引,一种是辅助索引(辅助索引),主键索引就是按照主键字段进行构成的索引组织表,通常我们在按照主键索引查询数据时,是直接就能返回所需要的记录的,因为主键索引的叶子节点上记录了该主键索引字段对应的行记录,但是如果我们要是通过辅助索引查找数据时,我们只能在它的叶子节点上先查找它对应的主键,然后再去主键索引上查找它的行记录,这种按照:辅助索引-->主键索引--->row记录的过程,我们就称之为回表操作。
2.从上面来看回表操作的过程,我们发现要经过两次的B+树搜素,这样相对与一次的搜素,它浪费了时间还消耗了磁盘的i/O
3.那么我们怎样可以避免回表操作呢?
1.最左匹配其实主要就是针对联合索引的,通过联合索引都是两个字段以上的组合,但通过不要超过三个字段,应该字段越多组成的联合索引后期的维护的成本也就越高
2.通过我们使用索引进行查询时,往往会发现执行计划中没有用到我们索建立的索引,这样就导致我们建立的索引失效,因此知道索引匹配原则,而对于Mysql而言,索引匹配原则用的是最左匹配原则,知道最左匹配原则,对我们建立索引是要很大帮助的。
3.这里关于最左匹配原则用如下一张表来表示: 其中(a,b,c)是构造的联合索引
在开始之前先准备一张用户表(user),其中主要有几个字段:id ,name age .address. 然后在建立联合索引(name,age)
要求:匹配姓名第一个字为陈,年龄为20岁的用户
SELECT * from user where name like ‘陈%‘ and age=20
看看这条sql语句是如何执行的?
5.6版本之前:
5.6版本以及之后的版本
4.3 总结
set optimizer_switch=‘index_condition_pushdown=off‘;
原文:https://www.cnblogs.com/zmc60/p/14938740.html