MySQL占用内存的计算方法

Posted 幸福丶如此

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL占用内存的计算方法相关的知识,希望对你有一定的参考价值。

结合官方文档 https://dev.mysql.com/doc/refman/5.7/en/memory-use.html 和 percona文档 https://www.percona.com/blog/2018/06/28/what-to-do-when-mysql-runs-out-of-memory-troubleshooting-guide/

得出以下MySQL占用内存的计算方法

--查看每个线程占用多少内存,然后乘以正在运行的线程(也就是排查sleep的)。
SELECT ( ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@max_allowed_packet
+ @@net_buffer_length )
) / (1024*1024) AS MEMORY_MB;

--查看MySQL全局占用多少内存
select (@@innodb_buffer_pool_size
+@@innodb_log_buffer_size
+@@key_buffer_size) / 1024 /1024 AS MEMORY_MB;

--查看performance_schema占用多少内存
SELECT SUBSTRING_INDEX(event_name,'/',2) AS
       code_area, sys.format_bytes(SUM(current_alloc))
       AS current_alloc
       FROM sys.x$memory_global_by_current_bytes
       GROUP BY SUBSTRING_INDEX(event_name,'/',2)
       ORDER BY SUM(current_alloc) DESC;

--查看 memory 存储引擎占用多少内存
select sum(max_data_length)/1024/1024 as MEMORY_MB from tables where engine='memory';

--查看innodb_buffer_pool情况
select sum(POOL_SIZE),sum(free_buffers),sum(DATABASE_PAGES) from INNODB_BUFFER_POOL_STATS;

--根据thread的个数,计算内存
select count(*) from information_schema.processlist where db="db_name" ;

扩展:如果出现MySQL内存过高,一般需要优化数据库的参数

performance_schema_max_table_instances=150
table_definition_cache=150
table_open_cache=64
performance_schema = off
innodb_buffer_pool_size = 6144M    #这个参数值生产环境一般是物理内存的 3/4 ,其他环境可以根据情况调整

以上是关于MySQL占用内存的计算方法的主要内容,如果未能解决你的问题,请参考以下文章

mysql内存占用计算

如何计算一个对象占用的内存空间

mysql5.6启动占用内存很大的解决方法

mysql5.6启动占用内存很大的解决方法

MySQL占用内存过高怎么办

MYSQL使用内存计算