Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2383855
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类: Mysql/postgreSQL

2011-08-08 08:43:25

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)

阅读(2607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~