msyql的内存计算

本文将讨论MySQL内存相关的一些选项,包括:html

单位都是b,不是kb,即1B=1/(1024*1024*1024)Gmysql

  • 1)全局的buffer,如innodb_buffer_pool_size;
  • 2)线程级的选项,如binlog_cache_size;
  • 3)为特定操做分配的缓冲区,如sort_buffer_size。

咱们只讨论内存相关的选项,其余一些如innodb_open_filesthread_cache_sizetable_definition_cachetable_open_cache这类限制文件描述符合线程数量的选项不在讨论之列sql

1. MySQL的理论内存上限

最近咱们在作的一个项目,须要检查MySQL的理论内存上限,同事在http://www.mysqlcalculator.com/找到一个内存计算公式,以下所示:缓存

key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + max_connections * (sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size)服务器

show variables where variable_name in (
'key_buffer_size',
'query_cache_size',
'tmp_table_size',
'innodb_buffer_pool_size',
'innodb_additional_mem_pool_size',
'innodb_log_buffer_size'
);

show variables like 'max_connections';

show variables where variable_name in (
'sort_buffer_size',
'read_buffer_size',
'read_rnd_buffer_size',
'join_buffer_size',
'thread_stack',
'binlog_cache_size'
);

这个公式能够说是错的,由于,这个公式并不能很是准确的描述MySQL的实际内存使用状况,实际内存使用状况远比这个公式要复杂,随着具体的应用场景不一样而存在差别。这个公式也能够说是对的,由于,该公式大体估算了一个MySQL实例可能须要的内存,能够做为一个参考值。session

那么,在实际应用中,咱们怎么判断具体的内存使用状况?根据什么条件来调整这些参数?调整为多少比较合适呢?要回答这些问题,还得从原理讲起。数据结构

2. MySQL内存参数的含义

在这一节,咱们首先对内存参数进行了一个分类,而后对各个参数的含义进行了详细的讨论。性能

2.1 内存参数分类

2.1.1 服务器级别

服务器级别的buffer是全局且惟一的,影响全部的链接和查询,须要注意的是,服务器级别的buffer中,大部分是服务器启动的时候分配的,小部分是后来分配的。如query_cache,初始值是0,后续不断增加,直至最大。线程

  • innodb_additional_mem_pool_size # 该参数查不到
  • innodb_buffer_pool_size
  • innodb_log_buffer_size
  • key_buffer_size
  • query_cache_size

sql查询语句日志

show variables where variable_name in (
'innodb_buffer_pool_size',
'innodb_log_buffer_size',
'innodb_additional_mem_pool_size',
'key_buffer_size',
'query_cache_size'
);
2.1.2 线程级别

这些buffer是线程级别的,对于每一个线程都会分配,所以,占用的内存状况为max_connection * (thread_options),线程级别的选项有:

  • binlog_cache_size
  • binlog_stmt_cache_size
  • net_buffer_length
  • query_prealloc_size
  • thread_stack

sql查询语句

show variables where variable_name in (
'net_buffer_length',
'thread_stack',
'query_prealloc_size',
'binlog_cache_size',
'binlog_stmt_cache_size'
);
2.1.3 为特定操做分配的缓冲区

当服务器执行特殊操做时,根据须要分配缓冲区。所以,很难计算缓冲区的具体大小。好在这些缓冲区都是session级别的,咱们能够保持全局较小的取值,若是须要,再修改session级别的缓冲区大小。

a.对每一个线程分配一次

  • read_rnd_buffer_size
  • sort_buffer_size
  • myisam_mmap_size
  • myisam_sort_buffer_size
  • bulk_insert_buffer_size
  • preload_buffer_size

sql查询语句

show variables where variable_name in (
'read_rnd_buffer_size',
'myisam_mmap_size',
'myisam_sort_buffer_size',
'bulk_insert_buffer_size',
'preload_buffer_size'
);

b.对每一个线程分配屡次(可能)

  • join_buffer_size
  • read_buffer_size
  • tmp_table_size
show variables where variable_name in (
'join_buffer_size',
'read_buffer_size',
'tmp_table_size'
);

2.2 内存参数的含义

各个变量的含义比较好掌握,官方参考手册上都有,可是,何时应该修改,修改成多少才是合适的值?手册上并无给出,本文将回答这个问题。

  1. query_cache_size 这是MySQL的查询缓存,用以缓冲SQL语句的结果,若是下次有相同的SQL语句,而且,结果尚未invalid掉,则直接返回查询缓存中的结果便可。这是理想状况,实际状况query_cache可能致使激烈的锁竞争,使得性能反而降低,MySQL 5.7已经能够关闭query_cache了。

  2. innodb_additional_mem_pool_size # (没有查到mysql5.7_aliyun_RDS) 该缓存用以存放数据字典和内部数据结构的信息,通常状况下,表越多,该选项也应该越大,该选项太小时,Innodb会在错误日志中打印错误信息,能够等到有错误日志之后再调整。

  3. innodb_buffer_pool_size Innodb为存储数据、索引、undo、自适应索引等分配的内存大小,影响innodb性能最重要的选项,通常设置为物理内存的80%。

  4. innodb_log_buffer_size Innodb重作日志(redo)的大小,通常取默认值便可。

  5. key_buffer_size MyISAM表缓存索引的缓存,建议不用MyISAM表。

  6. net_buffer_length 服务器在客户端链接创建之后建立的缓存大小,用来保持请求和结果。根据须要,这个大小能够增加至max_allowed_packet。

  7. thread_stack 每一个线程的栈大小,若是该变量设置太小,将会限制SQL语句的复杂性、存储过程的递归深度,以及服务器上其余内存消耗型的操做。对于大部分安装来讲,默认取值便可。若是有相似”Thread stack overrun”,则须要增大该值。

  8. query_prealloc_size 此缓存为语句解析和执行而分配,若是运行复杂查询,增长缓存是合理的,这样mysqld不会在执行查询的时候在分配内存上耗时。

  9. binlog_cache_size 缓存binlog的缓冲区,若是大于该值,缓存中的binlog将写到磁盘的临时文件中。

  10. binlog_stmt_cache_size 缓存非事务表的binlog。

  11. read_rnd_buffer_size 存放排序和发送结果至客户端之间,读取结果的大小,大的值能提升order by的性能

  12. sort_buffer_size 每一个线程须要排序的时候会分配此缓存,经过检查sort_merge_passes状态变量来判断是否须要增长该缓存的大小。sort_buffer_size缓存常常会分配,因此,大的GLOBAL值会下降性能而不是增长性能。所以,最好不要设置得太大,在须要的时候经过set session增长便可。

  13. join_buffer_size 链接操做分配的缓冲区,为了检查是否须要增长join_buffer_size的取值,能够检查Select_sacn状态变量,它包括第一张表执行完整扫描的链接次数,一样,select_full_range_join,它包含使用范围搜索的链接次数。

  14. read_buffer_size 为表顺序扫描分配的缓存

  15. tmp_table_size 临时表的最大值,服务器默认设置为max_heap_table_size和tmp_table_size二者中较小的一个,若是有足够的内存,而且created_tmp_disk_tables状态变量再增大,则能够适当调大,把须要临时表的全部结果保持在内存中,以提升性能。

原文摘自 http://mingxinglai.com/cn/2016/04/mysql-memory-usage-formula/

http://blog.51cto.com/11819159/2129769

https://help.aliyun.com/document_detail/26316.html

相关文章
相关标签/搜索