Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109972
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 13:16
个人简介

数据库领域专心吃草

文章分类

全部博文(13)

文章存档

2015年(1)

2014年(4)

2013年(8)

我的朋友

分类: Mysql/postgreSQL

2013-12-20 09:56:32

    read_rnd_buffer_size:官方文档是这样解释的,当需要从myisam表中读取的数据需要排序的时候,使用read_rnd_buffer_size来避免磁盘扫描。这句话中有3个关键信息:myisam表、排序和磁盘扫描。

    read_rnd_buffer_size真的只能用于myisam吗?

    答案是“否”,read_rnd_buffer_size可以适用于所有的存储引擎。

    read_rnd_buffer_size是如何帮助优化排序和减少磁盘扫描的?

    在解决这个问题之前先来了解一下这个参数:max_length_for_sort_data。mysql4.1之后mysql提供了2种算法来处理排序。

      第一种排序:
    1、读取所有排序用到的数据,只包含sort key(排序用到的键值)和row pointer(指向行数据的位置)
     2、根据sort key进行排序
     3、根据排序好后的顺序,使用row Pointer去取数据。由此可以看到,每次排序需要用到2次磁盘操作,根据row pointer取磁盘数据的操作基本上都是            离散读取的,所以磁盘开销很大。
      第二种排序:
     1、读取所有排序用到的数据,包含sort key、row pointer和行数据
     2、根据sort key 进行排序
     3、排序之后,可以直接从读取的行数据缓存中(sort_buffer)取数据,减少了随机磁盘操作。

     max_length_for_sort_data决定了mysql应该使用哪一种算法,如果除了sort key以外的字段(selected)长度之和大于max_length_for_sort_data时会使用第一种排序算法。小于max_length_for_sort_data会使用第二种排序算法。

    但是max_length_for_sort_data跟read_rnd_buffer_size有什么联系呢?

    当mysql使用第一种算法取大量数据的时候,mysql会尝试对选择的字段进行转换,全部转换成fixed(固定长度),Blob和text类型无法转换。当sort_buffer中的sort key排序过后,mysql会对row pointer进行排序,然后根据row pointer的顺序去取数据,如果这些row pointer是连续的,那么磁盘取数据的操作就有可能是顺序操作,然后把取到的数据存入read_rnd_buffer_size。

    总结read_rnd_buffer_size的限制:

    1、使用第一种排序算法进行排序(只有row pointer和sort key存储在sort buffer中)
    2、选择的字段中没有blob和text类型的字段
    3、排序过后取大量的数据。如果是分页取部分数据就有可能用不到read_rnd_buffer_size
    4、read_rnd_buffer_size会对每一个连接都会分配内存,所以注意内存使用量。

read_rnd_buffer_size的使用范围是很狭窄的。本文大部分内容参考:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/






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