必须将 tmp_table_size 与 max_heap_table_size 设为相同值,否则以内存较小者为准;调大后需重启 mysql 并监控 created_tmp_disk_tables 比值,优先优化 sql 和索引而非盲目扩容。

max_heap_table_size 和 tmp_table_size 这两个参数——它们共同决定 MEMORY 存储引擎表的最大尺寸,以及内部临时表(如 GROUP BY、ORDER BY 产生的)能用多少内存。
如果你建了一个 MEMORY 表却插入失败,报错类似 ERROR 1114 (HY000): The table 'xxx' is full,或者大查询频繁写磁盘临时表(Created_tmp_disk_tables 持续上升),那大概率是这两个值太小了,默认通常只有 16MB。
怎么改 max_heap_table_size 和 tmp_table_size
这两个参数必须在 MySQL 配置文件 my.ini(Windows)或 my.cnf(Linux/macOS)里设置,不是 php.ini。XAMPP 的 MySQL 配置文件路径通常是:
- Windows:
C:\xampp\mysql\bin\my.ini - Linux/macOS:
/opt/lampp/etc/my.cnf
打开后,在 [mysqld] 段落下添加或修改:
max_heap_table_size = 256M tmp_table_size = 256M
注意:
- 两个值建议设为相同,否则以较小者为准生效
- 单位支持
M(兆字节)、G(千兆字节),不能写成256MB或带空格 - 改完必须重启 MySQL 服务(XAMPP 控制面板点 MySQL 的 Stop → Start)
- 仅修改全局配置不影响已连接的客户端会话;新连接自动继承,已有连接需执行
SET SESSION tmp_table_size = 268435456;才能临时生效
为什么改了还是报 “table is full”
常见原因不止配置没生效,还有几个硬性约束:
-
max_heap_table_size是单个 MEMORY 表的上限,但实际可插入行数还受key_buffer_size(索引缓存)和字段类型影响;比如含大TEXT或BLOB字段的 MEMORY 表会被拒绝创建 - MEMORY 表不支持
TEXT、BLOB、JSON等变长大字段类型,尝试建表会直接失败,错误信息是ERROR 1034 (HY000): Incorrect key file...或更直白的Unsupported type for MEMORY engine - 如果用
CREATE TABLE ... ENGINE=MEMORY SELECT ...导入数据,MySQL 会先估算结果集大小,若预估超过max_heap_table_size,哪怕最终数据没那么多,也会提前中止 - 某些 XAMPP 版本自带的 MySQL 是 MariaDB 分支,其
max_heap_table_size还受max_allowed_packet影响——后者若太小,大 INSERT 语句根本发不进去
验证修改是否生效
别只信配置文件,进 MySQL 命令行确认当前值:
mysql -u root -p SHOW VARIABLES LIKE 'max_heap_table_size'; SHOW VARIABLES LIKE 'tmp_table_size';
再检查运行时状态:
SHOW STATUS LIKE 'Created_tmp%';
如果 Created_tmp_disk_tables 远高于 Created_tmp_tables,说明临时表仍频繁落盘,可能 tmp_table_size 还不够,或查询本身无法避免磁盘临时表(比如含 TEXT 字段的排序)。
替代方案:别硬扛 MEMORY 表
真要处理几十 MB 以上的热数据,MEMORY 表不是好选择——它全在内存、无持久化、锁粒度粗、不支持事务。更稳的做法是:
- 用 InnoDB 表 + 足够大的
innodb_buffer_pool_size(XAMPP 默认太小,建议设为物理内存的 50%~70%,如innodb_buffer_pool_size = 1G) - 对临时计算需求,用
CREATE TEMPORARY TABLE ... ENGINE=InnoDB,比 MEMORY 更可靠 - 导出/导入大数据时,优先走命令行
mysql -u root -p db ,避开 phpMyAdmin 和 PHP 内存双重限制
最易被忽略的一点:XAMPP 自带的 MySQL 配置极简,很多关键参数压根没显式写出,得自己加;而且 Windows 下 my.ini 文件可能被系统标记为“只读”,编辑前右键属性取消勾选。











