本页是 PmaControl 的原创文档。它保留了用于 MySQL 优化工作的实用索引结构,不复制第三方内容,也不依赖外部产品。
目标
MySQL 参数控制内存、线程、缓存、持久性和 I/O。它们应按角色记录,而不是像魔法清单一样修改。
参数类别
- 全局内存:
innodb_buffer_pool_size、key_buffer_size、表缓存。 - 每会话内存:
sort_buffer_size、join_buffer_size、read_rnd_buffer_size、tmp_table_size。 - InnoDB I/O:flush、redo log、page cleaners、读写线程。
- 连接:
max_connections、thread cache、文件限制。 - 历史兼容:query cache、MyISAM 和过时参数。
方法
从 SHOW VARIABLES 和 SHOW GLOBAL STATUS 开始,然后将值与实际行为比较。如果某个高值按连接分配,可能会恶化总内存使用。
另见:参数索引。
检查生效值与作用范围
先确认实例身份及进程实际使用的值。配置文件可能遗漏启动参数覆盖、持久化值或运行时修改。全局默认值与现有会话值可能不同。提出调整之前,记录单位、作用范围、来源、是否可动态修改或需要重启,以及原值。以下清单会忽略当前版本未提供的变量。
SELECT VERSION() AS server_version, @@version_comment AS distribution;
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size', 'innodb_log_buffer_size',
'innodb_redo_log_capacity', 'innodb_log_file_size',
'innodb_flush_log_at_trx_commit', 'sync_binlog',
'max_connections', 'thread_cache_size', 'table_open_cache',
'sort_buffer_size', 'join_buffer_size', 'tmp_table_size',
'max_heap_table_size', 'internal_tmp_mem_storage_engine',
'temptable_max_ram', 'temptable_max_mmap'
);
SHOW SESSION VARIABLES WHERE Variable_name IN (
'sort_buffer_size', 'join_buffer_size', 'tmp_table_size',
'max_heap_table_size'
);
为每类参数找到证据
| 类别 | 如何确认 | 需要评估的取舍 |
|---|---|---|
| 缓冲池 | 工作集、读取增量、进程 RSS | 缓存收益与主机内存余量 |
| Redo 容量 | 写入速率、日志等待、检查点压力 | 磁盘容量与恢复行为 |
| 会话缓冲区 | 实际排序、连接操作与活跃并发 | 按需分配和多个操作算子 |
| 连接及表限制 | 拒绝连接、线程创建、表打开速率 | 提高上限可能增加内存和争用 |
| 提交持久性 | 提交延迟与所需故障容忍度 | 吞吐量与已确认数据丢失风险 |
按分配行为规划内存
不要将所有配置缓冲区乘以 max_connections 并称为实际 RAM 使用量。许多查询缓冲区按需分配,一条查询可能创建多个连接缓冲区或临时表。区分全局内存、已连接会话开销和活跃查询内存,并保留压力场景用于分析。计入操作系统、其他服务和采集开销,再将模型与测得的 RSS 和内存压力比较。
MySQL TempTable 通过 temptable_max_ram 管理共享 RAM 预算;从 MySQL 8.0.28 起,tmp_table_size 也限制每个内部 TempTable 表。基于 MEMORY 的内部临时表使用 tmp_table_size 与 max_heap_table_size 的较小值。这些规则依赖引擎和版本。Redo 日志容量属于磁盘空间,innodb_log_buffer_size 属于 RAM,不能将两者都计入内存总量。
注意版本与持久化边界
MySQL 8.0.30 引入 innodb_redo_log_capacity,更早版本使用 redo 文件大小变量。查询缓存属于较早的 MySQL 版本,已在 MySQL 8 中移除。MariaDB 有自己的变量生命周期,需查阅其官方手册。未经验证,不要向新版本复制包含未知或已删除变量的配置。
每项变更都应确认影响现有会话、新会话,还是需要重启。运行时全局修改不一定持久化;MySQL SET PERSIST 会写入单独的持久化配置。保持运行值与预期重启值一致,分别记录回滚方案,并在受控环境测试重连和重启行为。同一负载下逐个验证假设,保持所需持久性,避免为醒目的吞吐量数字牺牲可靠性。