http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/
http://mysqldatabaseadministration.blogspot.com/2005/11/mysql-5-optimization-and-tuning-guide.html
翻阅文档查找read_rnd_buffer_size,你会发现这样的描述“当排序后按排序后的顺序读取行
时,则通过该缓冲区读取行,避免搜索硬盘。如果你使用了很多带有ORDER BY的语句,增大
该变量,可以改进性能。”很酷吧?但是它没有告诉我们read_rnd_buffer_size到底是怎么
工作的,也没有告诉我们它在那一层上工作,SQL层?或者存储引擎层?
确实它和read_buffer_size有着非常相似的名字,一般只能被MyISAM表使用,所以我认为
read_rnd_buffer_size也只能被MyISAM使用。但是和Monty谈过后,我了解情况并非如此。
read_rnd_buffer能被所有存储引擎使用,而不仅仅是MyISAM。它针对某些排序之后优化读取行。
下面是它怎样工作的:
执行过排序之后,当有行指针和键值一起的时候,它能被执行--MyISAM的偏移量和Innodb的
主键值,或者存储所有检索回的数据(对小数据是有效的)。
如果带有行指针存储的排序被使用,and the fields which are being length can be
converted to fixed size (basically everything but BLOB/TEXT)MySQL能使用
read_rnd_buffer_size优化数据检索--因为数据已经被key value排序过了,它需要被访问,
以非常随机行指针(典型地物理)顺序。MySQL从sort_buffer里取大量的指针(仅仅够填满
read_rnd_buffer),并且使用行指针排序,当按照排序好的顺序执行读取到read_rnd_buffer
的时候,如果你幸运的话,它就是非常连续地。
read_rnd_buffer_size非常重要(优化工作在下列条件执行):
1.行指针被存在sort_buffer中,而不是select的所有数据
2.没有select Blob/Text列
3.排序后返回了许多行--如果你使用了limit 10,这样做不太可能有帮助,因为MySQL将快
速地使用指针停止取行
对我来说这样的意思是从MySQL4.1开始这个选项就在很小的范围情况才能使用--如果你取回
少量的域数据(比max_length_for_sort_data小)应该被存储在sort buffer中,并且排序
文件,所以这里没有必要使用read_rnd_buffer,如果select的列很长,所以比max_length_for_sort_data
还要长。它通常是因为有些TEXT/BLOB列被选中。它将要被使用然而如果有大量的列或者有长
VARCHAR列值使用,它只用几个UTF8 VARCHAR(255)来创建比max_length_for_sort_data长的一行,
在它的静态presentation.
我们应该做一些基准测试,来看看它是怎样影响MyISAM和Innodb的性能的。
query_cache_limit (> 1M, or use smaller result sets)
阅读(2594) | 评论(0) | 转发(0) |