mysql回表优化的两种场景

理解回表优化前,先简单了解mysql的两种索引

1.聚集索引 :mysql除了存储表的每一条数据,还要至少为一个表维护一个聚集索引,这个聚集索引通常就是表的主键。如下图,mysql的数据以聚集索引的顺序存储在磁盘中。

 

 

 

 

 

2.普通索引   : 每一个表中只可以有一个聚集索引,但是可以有多个普通索引。聚集索引的叶子节点存储的是单条记录的所有数据,普通索引的叶子节点存储索引列的数据和主键索引的值。

3.通过普通索引查询整条数据的流程:先通过普通索引树查询到叶子节点存储的主键,再通过主键索引查询到具体的记录。

4.1回表查询的两种优化:覆盖索引

普通索引的叶子节点是包含索引列数据的,当我们需要查询的数据都在索引列中,此时mysql根据普通索引就可以查询到我们需要的数据,此时就不需要再去走聚合索引查询行记录。

 

 

 

create index tb_username_name_qq on tb_user(username,name,qq); #创建索引

extra : using index condition   表示 查找使用了索引,但是需要回表查询数据

 

    using index ; using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 

 

 

4.2 子查询优化回表 

如果我们需要的数据包含大量字段,此时就不适合使用覆盖索引,此时我们可以对查询语句做一定改变,调整mysql对语句的执行策略。

//每查询到一个主键,做一次回表查询
explain select * from tb_user where username like '"username999999%'; 

 

 

 

 // 可以看到子查询里面的语句extra中是使用到了覆盖索引, null的话也是用到了索引,具体什么情况还没找到资料,有知道的可以评论区聊一聊

explain select * from tb_user where id in (select id from tb_user where username like '"username999999%' );

 

 

posted @ 2022-01-12 10:59  小熊vni  阅读(516)  评论(0)    收藏  举报