2011年11月9日星期三

再谈read_rnd_buffer_size参数

<MySQL性能调优与架构设计>一书中在讲到read_rnd_buffer_size的时候, 说它是进行random scan的时候使用到的buffer, 但是我记得前面我读到过一篇资料, 说read_rnd_buffer_siza仅仅是在order by的时候能够起到有限的作用.
于是翻了一下前面的文章, 并且也参阅了mysql官方文档中<How MySQL Uses Memory>一部分, 发现那片文章中讲read_buffer_size是只是for MYISAM用的其实也是不正确的, 因为官方文档中说了, 这两个参数都是适用与所有存储引擎的.(不过那篇文章是07年写的, 那个时候也许还真是只for MYISAM)

说道的两篇文章参见:
其实read_rnd_buffer_size的作用在这两篇文张里面已经说得明白了, 我这里补充记录一下:
在第一种排序算法中, 因为放在sort buffer中的只有参与排序的列以及row point, 因为排序以后, row point是乱的, 是随机的, 所以直接按照排序的顺序去读取需要的数据会比较慢, 因为是随机读取. 而read_rnd_buffer_size的作用就在于将排序以后的列以及row point放到read_rnd_buffer中, 按照row point再进行一下排序, 然后按照这个顺序去读取数据, 运气好的话, 排序以后的row point对应的数据也是连续的(比如说按照类似于creation date这样的列进行排序), 这样读起来就会比较快了.

我觉得, 这样按照row point读取出来的数据有不是query需要的排序了, 所以还要按照原来sort buffer中的顺序再组织一下, 这一步应该也会带来一些cost.

没有评论: