排序的第二次IO有点疑惑
来源:3-8 ORDER BY语句优化-2
Panda_io
2021-04-28 15:55:14
一排序需要两次IO,也就是第二步:把(id, order_ column )扔到sort_buffer. ;第六步:通过id去获取需要返回的其他字段。由于返回结果是按照order_column排序的,所以id是乱序的,会存在随机IO的问题。MySQL 内部针对这种情况做了个优化,在用ID取数据之前,会按照ID排序并放到一个缓存里面,这个缓存大小由read_rnd_buffer_size控制接着再去取记录,从而把随机IO转换成顺序IO
问题(1)请问老师,既然已经按照排序字段排好序了,然后又对id进行排序转换成顺序IO这里岂不是又变成乱序了吗?
问题(2)顺序IO跟随机IO的区别是什么呢?是顺序IO可以利用索引范围一次获取多条数据吗?
1回答
您好,不好意思,回答得有点晚。问题问得非常棒!
问题1:
这个问题其实不会出现,可以认为进入sort buffer的数据返回很快,时间忽略不计;但之后要回表查询,如果一会查询id = 5的数据,一会id = 10000000的数据,磁盘就要随机寻址。按照id排序,再回表主要是解决这个问题的。
回表查询完数据后,又是内存计算了,这个时间又可以忽略不计了。
还记得这一章开头说过,性能主要和操作磁盘的次数有关系。
问题2:
举个例子哈,假设现在知道需要查询 id = 5, 100000000, 60, 300000000, 19999999 这5条数据。
一种是一条一条查,一次读一个page,5和100000000的数据不在一个page,于是要读两次磁盘;100000000和60也不在同一个page,又要读一次,一次类推,极限情况下,5条数据要读5次磁盘。
搞成顺序IO后,就变成了 5,60,100000000,19999999,300000000 5和60如果在同一个page,一次就可以读取到了。
还是那句话,主要看操作磁盘的次数。这是最大的性能瓶颈。
相似问题