ITPub博客

首页 > 数据库 > MySQL > MySQL源码分析(2):Mysql中的内存分配相关

MySQL源码分析(2):Mysql中的内存分配相关

原创 MySQL 作者:jacobxian 时间:2015-09-06 15:12:35 0 删除 编辑

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:50 上午

Mysql中的内存分配相关

  1. 涉及到内存的配置参数
      这些参数可以分成两部分,分别对应MySQL中的两个层次:服务器层和存储引擎层。


    1. MySQL服务器相关:

      每个连接到MySQL服务器的线程都需要有自己的缓冲,默认为其分配256K。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,例如存储查询语句的空间等。但如果对数据表做复杂的操作比较复杂,例如排序则需要使用临时表,此时会分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。

      read_buffer_size是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

      sort_buffer_size是MySql执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小。该变量会监测sort_merge_passed, sort_range, sort_rows, sort_scan的状况。通常较小的sort_merge_passed性能越高,但是也与workload的特性有关。

      read_rnd_buffer_size是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
      query_cache_size是MySql的查询缓冲大小。(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

      此外还有每个连接中会使用的一些变量会消耗少量内存。

    2. MyISAM引擎相关

      key_buffer_size存储了所有index的缓存,一般我们设为16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用'key_read%'获得用来显示状态数据)。key_buffer_size只对MyISAM表起作用。即使不使用MyISAM存储引擎,但是内部的临时磁盘表是MyISAM表,故也要使用该值。

    3. InnoDB引擎相关

      innodb_buffer_pool_size对于InnoDB表来说,作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,手册上推荐把该值设置成物理内存的80%。
      innodb_additional_mem_pool_size指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。
      innodb_log_buffer_size指定InnoDB用来存储日志数据的缓存大小,如果您的表操作中包含大量并发事务(或大规模事务),并且在事务提交前要求记录日志文件,请尽量调高此项值,以提高日志效率。

      ?


    • Key_buffer_size

      ?

    • Table_open_cache

      ?

    • Sort_buffer_size

      ?

    • Read_buffer_size

      ?

    • Net_buffer_length

      ?

    • Read_rnd_buffer_size

      ?

    • Innodb_buffer_pool_size

      ?

    • Innodb_additional_mem_pool_size

      ?

    • Innodb_log_buffer_size

      ?

    • Query_cache_size
  2. Mysql中最小内存占用公式
      ?


    • key buffer

      ?

    • innodb buffer pool

      ?

    • innodb log buffer

      ?

    • innodb additional mempool

      ?

    • net buffer
      ?


    • sort buffer

      ?

    • myisam sort buffer

      ?

    • read buffer

      ?

    • join buffer

      ?

    • readrnd buffer

    minmemoryneeded = globalbuffers + (threadbuffers * max_connections)

    其中globalbuffers 包括:

    threadbuffers 包括:

参考资料
http://dev.mysql.com/doc/refman/5.0/en/memory-use.html
http://www.mysqlperformanceblog.com/2006/05/17/mysql-server-memory-usage/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29114615/viewspace-1792432/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-07-16

  • 博文量
    18
  • 访问量
    40145