MYSQL走非聚集索引再走主键索引的时候为什么不对查询到的主键的物理位置进行排序再进行磁盘读?

有一个问题,我们都知道,mysql是主键聚集索引的,每个非叶子页保存着表行的页号,然后根据页号在磁盘上进行读取,获取表行数据.
问题来了:
1.但是如果mysql先走非聚集索引,获取到主键值以后,在主键的聚集索引上查找到主键在磁盘上的物理位置,进行读取的时候,因为获取到的主键值不是顺序的,所以导致全部的随机I/O,我觉得很奇怪,为什么mysql不先对获取到的页号进行排序,这样不就可以较为顺序的读取了吗,而且内存中排序速度很快,这样可以降低大量随机I/O时间啊.为什么不这么做而是直接进行随机读取呢?
2.我将非叶子页保存的指向表行的页号理解为该表行在磁盘上保存的物理位置,磁盘根据这个物理位置进行磁头和磁臂的移动以读取该表行数据,这个理解是没问题的吧?
请教各位大神啦~~谢谢.

阅读 3.9k
2 个回答

顺序IO指数据的物理存储是连续的,因此磁盘读取的时候也可以连续读取,不需要重新定位进行磁头寻道,因此读取能力比随机读取IO要高很多。

非聚集索引获取到主键值,按照你的说法对主键值进行排序后,各主键值的存储位置仍可能差异很大,这时候还是随机IO。如:一个表,有id和name两个字段,id=1 和 id=1000的name=张三,如果按照name上创建了非聚集索引,并在按照name=张三进行查询,id排序后用处也不大。

你理解的顺序io、随机io稍微有点问题,顺序io是指磁盘上相邻的块,并不是说聚集索引顺序的,他的存储就也是顺序的,数据存储的时候并不是只有这个表在写磁盘,还有其他的表,每次写数据系统分配的空间只有一小块,因为系统是不知道你到底会写多少数据的,所以他们的存储是顺序存储的,但不是顺序io的概念,可能中间间隔了很多其他数据表的数据块,所以在查询检索的时候当然也绝大部分都是随机io,这个随机也不是说就是无序的,也是按照聚集索引的存储顺序进行读取的,因为他们在磁盘上的存储也是相对有序的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题