请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于innodb主键索引的问题

想问一下,有一张表a,任何索引都没有,只有主键和其他字段。
当我查询select * from a时,这时候explain查看自然是走了ALL的全表查询。
当我查询select id from a时,这时候explain查看却是走了主键索引而不是全表查询。
我理解主键索引作为B+树的结构,非叶子节点只存储了一个范围,比如id5以下的指向一个数据页,id10以下的指向另一个数据页,即便我查询的只有id列,也不应该存在所谓覆盖索引的情况,也应该查询所有数据页才能获取到每一条数据的id。

请问一下老师,是我理解上哪里出问题了么,为什么实际情况当只查询id列的时候,不需要走全表搜索,只在非叶子节点就能完成这个查询呢?

正在回答 回答被采纳积分+3

1回答

sqlercn 2020-03-28 10:13:06
因为只查id的话可以通过主键索引获得,所以只用主键扫描就可以了,你可以看看innodb的存储结构
0 回复 有任何疑惑可以回复我~
  • 提问者 烈焰卡卡 #1
    但是非叶子节点存储的是范围,不扫描到叶子节点,是如何能获取到都有哪些id呢?具体有多少id,应该是和数据行一起错不在我叶子节点的数据页吧
    回复 有任何疑惑可以回复我~ 2020-03-28 10:19:48
  • 提问者 烈焰卡卡 #2
    就以原题中为例子,我查询select id from a where id=8,非叶子结点应该只存储了5和10这个区间的指针,我的理解是应该还是要读到叶子节点才能查询到是否存在id为8的数据,非叶子节点应该并不能知道8是不是存在的数据
    回复 有任何疑惑可以回复我~ 2020-03-28 10:41:12
  • sqlercn 回复 提问者 烈焰卡卡 #3
    你这是查询只涉及id列,所以只扫描id列的主建索引就可以了
    回复 有任何疑惑可以回复我~ 2020-03-28 12:21:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信