mysql回表与索引覆盖
mysql回表与索引覆盖
回表:
-
回表即回表查询,先定位主键值,在定位行记录.查询效率较低.
-
集聚索引(聚簇索引):
a. 一个表只有一个聚集索引,默认主键是聚集索引
b. 如果表中没有主键,则第一个非空且唯一列为聚集索引.
c. 否则,InnoDB会创建一个隐藏的row-id作为聚集索引
聚集索引叶子节点存储:行记录.(下图左) -
普通索引:
普通索引(name)叶子节点存储:主键值(下图右) -
eg:表结构:(id 主键, name 普通索引, sex, flag);假设有四条记录:


- 当执行语句:select * from table where name = 'ls'
语句的执行顺序如下图,通过普通索引先找出主键值,在通过主键值拿到行记录,这个过程就是回表查询.

覆盖索引:
-
当执行:select name from table where name = 'ls'
通过explain分析我们可知,使用了覆盖索引,而不会在去回表查询,因为通过普通索引就可以拿到要查询的字段. -
如果执行select name,sex from table where name = 'ls'
此时普通索引并没有sex字段的值,所以拿到主键值之后,会回表查询记录,拿到sex值. -
若建立联合索引时,即name,sex都加上索引,此时再去查询,会发现Extra又出现Using index,此时就是覆盖索引生效,通过覆盖索引一次就能拿到需要的数据,不用在回表,此时可以提高我们的查询效率.


浙公网安备 33010602011771号