对InnoDB 覆盖索引的疑问
首先, 我对覆盖索引的了解是, 如果创建了二级索引后, 要想做到覆盖索引, 那么你 select 的列就要被你的索引所覆盖 比如,当我创建一个二级索引 idx_name_age(name, age)
对 select name from user where name = "Jhon"
; 语句, 自然就可以做到覆盖索引
这样就不用再回表走聚簇索引了
但是 当我 select id from user where id = 1
; 时, 这个用到了主键索引, 也就是会直接走聚簇索引, 既然走聚簇索引的话, B+Tree的叶子节点是包含所有列的, 那我认为 select * from user where id = 1
; 也是一样的
但explain的分析结果发现 select id from user where id = 1
; 是主键索引, 并且做到了覆盖索引
但是 select * from user where id = 1
; 虽然是主键索引, 但却不是覆盖索引, 这是为啥?
可以这样理解吧,
主键索引,那么就是按照主键排序,组成B+树,例如你的id,那么主键索引的索引键就是id,而剩余的行数据只是跟在索引键后面而形成聚簇表,主键索引并没有对除主键以外的数据进行索引;
那么,从覆盖索引的概念:select语句所有要查询的列都必须是索引键,也就是说对于主键索引,覆盖索引应该是只查主键,这样主键索引才起到“覆盖”的作用;而select *是需要把整行数据都查出来,并不只是查询主键了。