InnoDB内存管理
先放一张mysql innodb内存项的全局概览图,主要包括三部分:
- buffer pool:Innodb缓存池,根据实际内存规格,会占到总体内存的50%-75%(内存规格越大,占比可以越大)
- 全局共享内存:sharding部分这种buffer和cache
- 线程独享内存:join、read、sort等这种buffer
全局共享部分
-
innodb_buffer_pool_size:InnoDB缓冲池的大小(50%-75%总内存)
-
innodb_additional_mem_pool_size:InnoDB存放数据字典和其他内部数据结构的内存大小,5.7已被移除(推荐16MB)
-
innodb_log_buffer_size:InnoDB日志缓冲的大小(推荐64MB)
-
key_buffer_size:MyISAM缓存索引块的内存大小(推荐10MB)
-
query_cache_size:查询缓冲的大小,8.0已被移除(推荐 0)
线程独占部分
-
thread_stack:每个线程分配的堆栈大小 (默认256k)
-
sort_buffer_size:排序缓冲的大小 (默认512k)
-
join_buffer_size:连接缓冲的大小 (默认512k)
-
read_buffer_size:MyISAM顺序读缓冲的大小 (默认512k)
-
read_rnd_buffer_size:MyISAM随机读缓冲的大小、MRR缓冲的大小 (默认512k)
-
tmp_table_size/max_heap_table_size:内存临时表的大小 (默认16M)
-
binlog_cache_size:二进制日志缓冲的大小 (默认32k)
最大链接数配置
根据上图的内存分布,可以得到max_connection的计算公式:
total_memory=innodb_buffer_pool_size+key_buffer_size+innodb_log_buffer_size+innodb_additional_mem_pool_size + query_cache_size + max_conns*(read_buffer_size+tmp_table_size+read_rnd_buffer_size+sort_buffer_size+join_buffer_size+binlog_cache_size+thread_stack) + 200MB(主机其他进程占用)
注意:这里tmp_table_size值通常在16MB以上,放在session级别计算连接数,在内存较小的场景可能能max_connection计算出来较小,可以考虑放到全局部分计算,并适当保留一下buffer。