根据实际设置计算 InnoDB 和服务器内存场景。预填值仅用于演示 16 GiB 服务器,并非配置建议。
二进制单位:1 GiB = 1024 MiB。支持字节数或 K/M/G/T,例如 268435456、256M、8G。计算仅在浏览器中进行。
启用 JavaScript 以使用计算器。下方说明和查询仍可阅读。
场景结果
- InnoDB 内存
- 负载场景
- max_connections 压力场景
- 场景余量
- 全局分配与预留
- 连接基础内存
- 活动查询缓冲区
- 临时表与本地内存块
- 数据库服务器预算
- 当前已监测的 InnoDB 内存
- 当前进程 RSS
估算,并非保证的最大值
负载、会话覆盖设置和未监测的分配可能超出此模型。压力场景采用相同操作数量,将所有连接视为活动连接。请在代表性负载下验证 RSS、cgroup 限制、swap 和峰值。redo/undo 文件及 innodb_redo_log_capacity 表示存储空间,并非等量 RAM 分配。
公式与假设
C = 连接数;A = 活动查询数;T = 每查询临时表数。各项预留只计入一次。
InnoDB = innodb_buffer_pool_size × (1 + overhead / 100) + innodb_log_buffer_size + dictionary + locks + transactions + adaptive_hash + compression + InnoDB_extra
G = InnoDB + key_buffer_size + aria_pagecache_buffer_size (MariaDB) + query_cache_size (MariaDB / MySQL 5.7) + other_global
B = thread_stack + 2 × net_buffer_length + max_digest_length + session_extra
Q = sort_buffer_size × sorts + join_buffer_size × joins + read_buffer_size × scans + read_rnd_buffer_size × random_reads + query_extra
Total = G + C × B + A × Q + Temp
Stress: C = A = max_connections
准确估算 InnoDB 内存
InnoDB 内存不仅是 innodb_buffer_pool_size。计算器计入缓冲池、可调整的管理结构预留、全局 innodb_log_buffer_size,以及您填写的其他 InnoDB 分配。MySQL 文档描述缓冲池结构约需额外 10% 内存;实际值取决于构建和负载,MariaDB 尤其需要实际验证。请使用正在运行的实际值,缓冲池大小经过舍入后可能与配置值不同。
数据字典、自适应哈希、锁、事务结构和压缩可能增加内存。仅补充尚未计入缓冲池或预留的分配。redo 容量、redo 文件和 undo 表空间属于磁盘资源;不要将文件大小当作 RAM。InnoDB 小计不包含其他引擎、Performance Schema、连接及查询缓冲区或操作系统。
读取运行设置
以下语句只读取数据。SHOW ... WHERE 会忽略不支持的变量。Threads_running 包括测量查询且只是瞬时值;请采用代表性并发和记录的峰值。Max_used_connections 是连接峰值,并非活动查询峰值。也要检查应用连接的会话设置:当前会话不能代表所有会话。
SELECT VERSION();
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'innodb_page_size',
'key_buffer_size', 'aria_pagecache_buffer_size', 'query_cache_size',
'max_connections', 'thread_handling', 'thread_stack', 'net_buffer_length',
'max_digest_length', 'max_allowed_packet', 'sort_buffer_size',
'join_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size',
'tmp_table_size', 'max_heap_table_size', 'internal_tmp_mem_storage_engine',
'temptable_max_ram', 'temptable_max_mmap', 'temptable_use_mmap'
);
SHOW GLOBAL STATUS WHERE Variable_name IN (
'Threads_connected', 'Threads_running', 'Max_used_connections',
'Created_tmp_tables', 'Created_tmp_disk_tables',
'Innodb_buffer_pool_pages_total', 'Innodb_buffer_pool_pages_data',
'Innodb_buffer_pool_pages_free'
);
SHOW SESSION VARIABLES WHERE Variable_name IN (
'sort_buffer_size', 'join_buffer_size', 'read_buffer_size',
'read_rnd_buffer_size', 'tmp_table_size', 'max_heap_table_size',
'internal_tmp_mem_storage_engine', 'max_allowed_packet'
);
SHOW ENGINE INNODB STATUS;
测量 InnoDB 和进程内存
如果该版本提供此 Performance Schema 内存表且 InnoDB 监测已启用,可以查看当前分配。覆盖范围随版本变化;稍后启用计数器无法重建所有早期分配。缺失行或零值并不代表没有内存消耗。不要将各监测项的峰值相加当作同一时刻的峰值。将当前总和填入可选 InnoDB 测量字段,它保持独立于模型。
SELECT EVENT_NAME,
ROUND(CURRENT_NUMBER_OF_BYTES_USED / 1048576, 2) AS current_mib,
ROUND(HIGH_NUMBER_OF_BYTES_USED / 1048576, 2) AS high_mib
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/innodb/%'
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC;
SELECT ROUND(SUM(CURRENT_NUMBER_OF_BYTES_USED) / 1048576, 2)
AS instrumented_innodb_mib
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/innodb/%';
Linux 下的 RSS 单位为 KiB:使用 K 后缀,或除以 1024 转为 MiB。RSS 涵盖整个进程。解释结果时,应考虑 cgroup 限制、系统页缓存、分配器保留内存和其他服务。
ps -C mariadbd,mysqld -o pid=,rss=,comm=
临时表规则及实际限制
MariaDB 和使用 MEMORY 的 MySQL 内部临时表由 tmp_table_size 与 max_heap_table_size 中较小的值限制每张表。一个查询可能同时存在多张表及多个连接缓冲区。模型按您选择的操作数量计算活动查询,而非为每个空闲连接分配全部查询缓冲区。
MySQL TempTable 的 temptable_max_ram 在会话间共享。从 8.0.28 起,tmp_table_size 也限制单张表;更早的类型只使用共享限制。本地内存块位于 RAM 限制之外,可能保留至线程退出。因此模型为每个连接预留一个块;实际块可能大于示例的 1 MiB。mmap 文件可能带来驻留页,文件容量限制并不等于 RAM 分配。
压力场景采用相同查询结构,将所有 max_connections 连接视为活动连接。它并非保证的上限。还应预留用户 MEMORY 表、网络缓冲区增长、SQL/BLOB、binlog、复制、预处理语句、线程缓存和其他分配。请用代表性负载下的进程峰值验证模型。估算或调优目标不会强制设置内存上限。
来源及验证
于 2026 年 10 月 13 日核查。原创说明参考 Releem 和服务器文档。Releem 示例列出 200 个连接和 32 MiB 限制,却乘以 16 MB。每连接一张表的正确对应结果为 6400 MiB = 6.25 GiB。应优先遵循具体引擎规则,而非通用公式。