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,此时就是覆盖索引生效,通过覆盖索引一次就能拿到需要的数据,不用在回表,此时可以提高我们的查询效率.

posted @ 2021-12-01 15:59  何许人也-h  阅读(69)  评论(0)    收藏  举报