在 Linux 服务器上,MySQL(或 MariaDB)占用的内存情况取决于多个因素,包括配置、负载、存储引擎、连接数等。下面是一些查看和分析 MySQL 内存使用情况的方法和常见配置说明。
一、查看 MySQL 当前内存使用情况
1. 通过 MySQL 命令行查看内存使用(推荐)
登录 MySQL:
mysql -u root -p
执行以下 SQL 查询:
SHOW ENGINE INNODB STATUSG
或查看全局状态和变量:
-- 查看关键内存相关变量
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'key_buffer_size';
SHOW VARIABLES LIKE 'query_cache_size'; -- 注意:MySQL 8.0 已移除查询缓存
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
SHOW VARIABLES LIKE 'thread_stack';
SHOW VARIABLES LIKE 'sort_buffer_size';
SHOW VARIABLES LIKE 'join_buffer_size';
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
2. 使用 Performance Schema(MySQL 5.6+)
-- 查看内存使用摘要
SELECT SUBSTRING_INDEX(event_name,'/',2) AS code_area,
FORMAT_BYTES(SUM(current_alloc)) AS current_alloc
FROM sys.memory_global_by_current_bytes
GROUP BY SUBSTRING_INDEX(event_name,'/',2)
ORDER BY SUM(current_alloc) DESC;
需要安装
sysschema(通常默认存在)。
二、主要内存参数说明
| 参数名 | 默认值(典型) | 说明 |
|---|---|---|
innodb_buffer_pool_size |
128M ~ 几 GB | 最重要,缓存表和索引数据,建议设置为物理内存的 50%~75%(专用数据库服务器) |
key_buffer_size |
8M | MyISAM 索引缓存,若不用 MyISAM 可调小 |
tmp_table_size / max_heap_table_size |
16M ~ 64M | 内存临时表大小限制,超过会转为磁盘表 |
sort_buffer_size |
256K | 每个连接排序操作的缓冲区,不要设太大(会乘以连接数) |
join_buffer_size |
256K | 用于无索引连接,每个连接独立分配 |
read_buffer_size |
128K | 顺序读取缓冲区 |
thread_stack |
256K ~ 512K | 每个线程的栈空间 |
binlog_cache_size |
32K | 二进制日志缓存(每个连接) |
⚠️ 注意:
sort_buffer_size、join_buffer_size等是每个连接分配的,连接数多时总内存会急剧上升。
三、估算 MySQL 最大内存使用
可以使用以下公式粗略估算最大内存使用:
最大内存 ≈ 全局内存 + (每个连接内存 × 最大连接数)
-
全局内存:
innodb_buffer_pool_sizekey_buffer_sizeinnodb_log_buffer_sizequery_cache_size(如启用)- 其他全局缓冲
-
每个连接内存(近似):
sort_buffer_sizejoin_buffer_sizeread_buffer_sizeread_rnd_buffer_sizetmp_table_size(可能)thread_stack
例如:
innodb_buffer_pool_size = 2G
key_buffer_size = 16M
max_connections = 200
sort_buffer_size = 256K
join_buffer_size = 256K
...
则连接部分内存 ≈ 200 × (256K + 256K + …) ≈ 200 × 1M = 200M
总内存 ≈ 2G + 200M ≈ 2.2G
四、系统层面查看内存占用
1. 查看 MySQL 进程内存使用
ps aux | grep mysql
输出示例:
mysql 1234 0.5 8.2 2000000 1350000 ? Ssl 10:00 2:30 mysqld
其中 RSS 列(1350000 KB ≈ 1.35GB)是实际使用的物理内存。
2. 使用 top 或 htop
top
按 Shift + M 按内存排序,找到 mysqld 进程。
3. 使用 smem 或 pmap
pmap -x $(pgrep mysqld | head -1) | tail -1
查看详细内存映射。
五、优化建议
-
合理设置
innodb_buffer_pool_size:- 专用数据库服务器:物理内存的 70%~80%
- 例如:16G 内存 → 设置为
12G
-
避免过大的 per-thread 缓冲区:
sort_buffer_size = 256K足够,不要设为 1M 以上join_buffer_size = 256K
-
控制最大连接数:
SHOW VARIABLES LIKE 'max_connections';过多连接会显著增加内存使用。
-
监控内存增长:
- 使用
sys.memory_global_by_current_bytes - 或使用监控工具(Prometheus + MySQL Exporter)
- 使用
六、参考配置示例(8G 内存服务器)
[mysqld]
innodb_buffer_pool_size = 4G
key_buffer_size = 32M
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
max_connections = 150
thread_cache_size = 10
总结
MySQL 内存占用 = 全局缓存 + 每个连接的缓冲区 × 连接数
- 主要内存来自
innodb_buffer_pool_size - 每连接缓冲区虽小,但连接数多时会累积
- 建议通过
SHOW VARIABLES和ps/top结合分析 - 避免内存溢出导致 OOM Killer 杀进程
如需更精确分析,可使用 sys schema 或 MySQL Workbench 的性能仪表板。
如果你提供你的 MySQL 配置文件(my.cnf)或服务器内存大小,我可以帮你具体分析。
云知识