登录 |

MySQL内存占用公式

2013年07月30日 上午 50:28 | 作者:

# Per-thread memory
$per_thread_buffers =  thread_stack + read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size;
$total_per_thread_buffers = $per_thread_buffers * max_connections;

# Server-wide memory
$server_buffers = key_buffer_size + query_cache_size + MAX(tmp_table_size, max_heap_table_size)
                + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size;

# Global memory
$total_possible_used_memory = $server_buffers + $total_per_thread_buffers;

Reference:mysqltuner.pl

  • max_connections
    允许的并行客户端连接数目。增大该值则增加mysqld 需要的文件描述符的数量。
  • read_buffer_size
    每个线程连续扫描时为扫描的每个表分配的缓冲区的大小(字节)。如果进行多次连续扫描,可能需要增加该值, 默认值为131072。
  • read_rnd_buffer_size
    当排序后按排序后的顺序读取行时,则通过该缓冲区读取行,避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只为需要运行大查询的客户端更改会话变量。
  • sort_buffer_size
    每个排序线程分配的缓冲区的大小。增加该值可以加快ORDER BY或GROUP BY操作。
  • thread_stack
    每个线程的堆栈大小。用crash-me测试检测出的许多限制取决于该值。 默认值足够大,可以满足普通操作。
  • join_buffer_size
    用于完全联接的缓冲区的大小(当不使用索引的时候使用联接操作)。一般情况获得快速联接的最好方法是添加索引。当增加索引时不可能通过增加join_buffer_size值来获得快速完全联接。将为两个表之间的每个完全联接分配联接缓冲区。对于多个表之间不使用索引的复杂联接,需要多联接缓冲区。
  • query_cache_size
    为缓存查询结果分配的内存的数量。默认值是0,即禁用查询缓存。请注意即使query_cache_type设置为0也将分配此数量的内存。
  • tmp_table_size
    如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表。如果你执行许多高级GROUP BY查询并且有大量内存,则可以增加tmp_table_size的值。
  • max_heap_table_size
    该变量设置MEMORY (HEAP)表可以增长到的最大空间大小。该变量用来计算MEMORY表的MAX_ROWS值。在已有的MEMORY表上设置该变量没有效果,除非用CREATE TABLE或TRUNCATE TABLE等语句重新创建表。
  • key_buffer_size
    MyISAM表的索引块分配了缓冲区,由所有线程共享。key_buffer_size是索引块缓冲区的大小。
  • innodb_buffer_pool_size
    InnoDB用来缓存它的数据和索引的内存缓冲区的大小。你把这个值设得越高,访问表中数据需要得磁盘I/O越少。在一个专用的数据库服务器上,你可以设置这个参数达机器物理内存大小的80%。尽管如此,还是不要把它设置得太大,因为对物理内存的竞争可能在操作系统上导致内存调度。
  • innodb_additional_mem_pool_size
    InnoDB用来存储数据目录信息&其它内部数据结构的内存池的大小。你应用程序里的表越多,你需要在这里分配越多的内存。如果InnoDB用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。默认值是1MB。
  • innodb_log_buffer_size
    InnoDB用来往磁盘上的日志文件写操作的缓冲区的大小。明智的值是从1MB到8MB。默认的是1MB。一个大的日志缓冲允许大型事务运行而不需要在事务提交之前往磁盘写日志。因此,如果你有大型事务,使日志缓冲区更大以节约磁盘I/O。