mysql内部临时表上限取tmp_table_size与max_heap_table_size中较小值,二者必须同步调整并重启生效;若仅改其一或未重启,则配置无效,且可能引发oom。

直接改 tmp_table_size 和 max_heap_table_size 就行,但必须同步调、必须重启、必须看实际内存余量——否则只是把问题从“慢”变成“OOM崩溃”。
为什么改了 tmp_table_size 却没效果?
MySQL 实际用的内存临时表上限,是 tmp_table_size 和 max_heap_table_size 两个值中的较小者。很多教程只改一个,另一个还卡在默认 16M 或 32M,结果你设了 256M 也白搭。
- 查当前生效值:
SHOW VARIABLES LIKE 'tmp_table_size';和SHOW VARIABLES LIKE 'max_heap_table_size'; - 两者必须相等,建议统一写成
64M(低配机)或128M(2GB+ 内存) - XAMPP 的配置文件是
XAMPP\mysql\bin\my.ini,不是/etc/my.cnf,别找错位置 - 改完不重启 MySQL,新值完全不生效——XAMPP 控制面板点 “Stop” 再 “Start” 最稳
怎么判断临时表是不是真在用磁盘?
光看参数没用,得看运行时行为。频繁写磁盘临时表(Created_tmp_disk_tables)是查询变慢的典型信号。
- 执行:
SHOW STATUS LIKE 'Created_tmp%'; - 计算比例:
Created_tmp_disk_tables / Created_tmp_tables * 100%,超过 25% 就该调了 - 如果
Created_tmp_disk_tables增长飞快,而你的 SQL 没改,大概率是tmp_table_size太小被迫落盘 - 注意:这个统计是全局累计值,重启 MySQL 会清零,所以最好在业务跑一阵后观察
低配机(≤2GB 内存)别乱设大值
设高了不等于快,可能直接拖垮整个 XAMPP。每个连接都会按 sort_buffer_size、read_buffer_size 等分配独占内存,加起来比临时表还吃资源。
- 建议组合配置(写进
my.ini的[mysqld]段):tmp_table_size = 64Mmax_heap_table_size = 64Msort_buffer_size = 256Kread_buffer_size = 256Kmax_connections = 30 -
sort_buffer_size是每连接独占,设成 2M 在 30 连接下就吃掉 60MB,对 1GB 机器很危险 - 禁用无用引擎能省几 MB 常驻内存:
skip-archive、skip-blackhole、skip-federated - 别碰
query_cache_size——MySQL 5.7+ 已废弃,XAMPP 7.4+ 配置里留着只会报 warning
真正容易被忽略的点:临时表大小调得再合理,如果 innodb_buffer_pool_size 还卡在默认 128M(XAMPP 常见),InnoDB 表读取照样慢。低配机建议先压到 32M 或 16M,腾出内存给临时表和连接缓冲——这不是玄学,是内存够不够分的问题。











