Linux下MySQL内存优化实操指南
一 内存占用构成与快速诊断
SHOW STATUS LIKE 'Threads_connected';、SHOW VARIABLES LIKE '%buffer%';、SHOW ENGINE INNODB STATUS\G),并用 top -b -n 1 | grep mysqld 观察进程 RSS;慢查询与无索引扫描常引发大临时表与额外排序/扫描内存开销,应结合慢查询日志与 EXPLAIN 优化索引与 SQL。二 核心参数建议与计算
Innodb_buffer_pool_read_requests / Innodb_buffer_pool_reads,目标≥99%。大实例可分片降低争用:innodb_buffer_pool_instances=8~16。示例(MySQL 8.0+):SET PERSIST innodb_buffer_pool_size = 8589934592;(8GB)。最大连接数 ≈ 核心数×2 + 磁盘数×5**;线程复用:thread_cache_size建议为max_connections` 的25%~50%;会话级缓冲区(sort/join/read 等)默认通常足够,仅在明确慢 SQL 时按会话调大,避免全局放大导致“连接×缓冲区”的乘数效应。三 持久化与动态调优步骤
/etc/my.cnf 或 /etc/mysql/my.cnf)。SET PERSIST 持久化全局变量(如 innodb_buffer_pool_size、tmp_table_size),避免重启;不兼容的参数或结构性变更再择机重启。四 Linux 系统层配合
/etc/security/limits.conf 为 mysql 用户设置 nofile ≥ 65536;必要时调大 open_files_limit 以匹配 table_open_cache。Threads_connected、缓冲池命中率、慢查询与临时表比例,确保既无频繁落盘,也无连接风暴与内存浪费。五 场景化配置示例
innodb_buffer_pool_size=物理内存的50%~70%;innodb_flush_log_at_trx_commit=1(最高安全)或 2(更高吞吐);innodb_flush_method=O_DIRECT;innodb_log_file_size=256M~1G;max_connections 按公式估算并配合 thread_cache_size;会话级缓冲区保持默认,仅在问题 SQL 会话级临时放大。tmp_table_size=max_heap_table_size=128M~256M;必要时适度提高会话级 sort_buffer_size/join_buffer_size;只读副本可设 innodb_read_only=1 降低写路径内存与锁开销。key_buffer_size=16M、max_connections=10~50、table_open_cache=200~400、innodb_buffer_pool_size=32M~128M,仅用于功能验证或资源受限环境。