linux服务器mysql占用内存?

在 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;

需要安装 sys schema(通常默认存在)。


二、主要内存参数说明

参数名 默认值(典型) 说明
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_sizejoin_buffer_size 等是每个连接分配的,连接数多时总内存会急剧上升。


三、估算 MySQL 最大内存使用

可以使用以下公式粗略估算最大内存使用:

最大内存 ≈ 全局内存 + (每个连接内存 × 最大连接数)
  • 全局内存

    • innodb_buffer_pool_size
    • key_buffer_size
    • innodb_log_buffer_size
    • query_cache_size(如启用)
    • 其他全局缓冲
  • 每个连接内存(近似):

    • sort_buffer_size
    • join_buffer_size
    • read_buffer_size
    • read_rnd_buffer_size
    • tmp_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

查看详细内存映射。


五、优化建议

  1. 合理设置 innodb_buffer_pool_size

    • 专用数据库服务器:物理内存的 70%~80%
    • 例如:16G 内存 → 设置为 12G
  2. 避免过大的 per-thread 缓冲区

    • sort_buffer_size = 256K 足够,不要设为 1M 以上
    • join_buffer_size = 256K
  3. 控制最大连接数

    SHOW VARIABLES LIKE 'max_connections';

    过多连接会显著增加内存使用。

  4. 监控内存增长

    • 使用 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 VARIABLESps/top 结合分析
  • 避免内存溢出导致 OOM Killer 杀进程

如需更精确分析,可使用 sys schema 或 MySQL Workbench 的性能仪表板。

如果你提供你的 MySQL 配置文件(my.cnf)或服务器内存大小,我可以帮你具体分析。