什么是回表查询?如何避免回表查询?

我们在索引中,有一种叫做聚集索引和非聚集索引的索引类型。
在聚集索引中,B+树上会存储这一行的全部数据,但是非聚集索引只会存储该列对应的值和相应行的主键。

是不是聚集索引的定义与主键索引很像?

其实就是的,当我们没有定义主键索引时,MYSQL会指定从左到有的第一个加了唯一索引和非空约束的列建立聚集索引,用它来代替主键索引。

聚集索引≈主键索引=唯一性约束+非空约束

那我们说了这么多?到底什么是回表查询呢?

比如有这么一张表 id name sex type
id为主键,name建立了普通索引。
比如我写下面的查询语句

select * from table where name ='ls'

由于name列建立的普通索引,那么就会去走name索引,但是我们发现 name索引里面只存放了name值和对应的主键 id,并找不到我们要的 sex type的信息。那么怎么办呢?
就必须重新去主键索引查找相关值。
因为主键索引存放了这一行的完整信息,但name没有。

就会发生下面的场景
什么是回表查询?如何避免回表查询?_第1张图片
回表查询其实就执行了两次B+树查询,这是一个既费时又费力的操作。
因此,我们要尽可能的避免回表查询。

我们再来看看回表查询的本质是什么?是不是普通索引找不到我们要的完整信息,迫不得已要执行回表查询,再回到主键索引或者聚集索引中查询数据。

那么解决回表查询的关键就是:索引覆盖

怎么理解呢?
比如

select id name from table where name ='ls'

这个就不会执行回表查询

select id name sex from table where name ='ls'

这个就要执行回表查询,因为sex在name索引上根本查不到。

那么怎么解决呢?
就是name 与 sex 可以建立联合索引。
这就是索引覆盖,大家可以感受一下。让索引范围覆盖住我们select 的范围,就不会发生回表查询。

你可能感兴趣的:(MySQL,数据库开发)