Mysql-回表-索引覆盖-最左匹配-索引下推-说明

212 阅读2分钟

回表

回表

如、表中有id、name字段

id为主键索引、name为普通索引

 select * from user where name = 'zhangsan'

回表是指在多个主键索引除外的情况下、对某一个索引进行条件筛选查询的时候、会查询当前这棵索引的B+Tree的时候会找到存在主键索引的ID值、然后在根据ID值去查询对应的B+Tree、找到整行数据、这个过程就叫回表

索引覆盖

索引覆盖

如、表中有id、name、age字段

id为主键索引、而(name/age)是联合索引

 select name,age from user where name = 'zhangsan'

索引覆盖是一种查询方式、不是索引类型、在我们通过对应的索引值、去查询指定字段、如select后的字段包含在这棵索引树中、就不会通过回表的方式去查询整列的数据

如何看到底走索引覆盖、通过EXPLAIN方式看Extra中是Using index

最左匹配

最左匹配

当创建索引的时候可以选择多列来创建联合索引(组合索引)、要做遵循最左匹配的原则。

如、表中有id、name、age、sex字段

id为主键索引、而(name/age)是联合索引

 select * from user where name = 'zhangsan' and age = 999
 select * from user where name = 'zhangsan'
 select * from user where age = 999
 select * from user where age = 999 and name = 'zhangsan'

图上案例第三个不会走索引、是因为他没有遵循最左匹配原则

而第四的会通过一个优化机制来、让它来符合当前索引查询的一个规则、就执行了我们最左匹配原则。

索引下推

索引下推

如:表中有id、name、age、sex字段

id为主键索引、而(name/age)是联合索引

 select * from user where name = 'zhangsan' and sex = 18

在没有索引下推之前、他是通过name索引去把数据获取出来到service层、然后在将sex等于18的做数据处理。

有索引下推后、会在存储引擎层面将数据等于name的查询出来并将sex等于18的数据做处理返回到service层。