mysql 8.0.16起internal_tmp_mem_storage_engine默认值改为temptable以提升临时表性能,需验证版本≥8.0.13、显式配置temptable并协同调优temptable_max_ram等参数,避免误用memory引发兼容性问题。

MySQL 8.0.16 起,internal_tmp_mem_storage_engine 默认值已从 MEMORY 改为 TEMPTABLE,这是提升临时表执行效率的关键优化。盲目保留旧配置或随意切换回 MEMORY,反而可能引发报错、内存浪费或性能波动。
确认当前引擎与版本兼容性
先验证是否具备使用 TEMPTABLE 的条件:
- 执行
SELECT VERSION();确保 ≥ 8.0.13(TEMPTABLE 引擎最低支持版本) - 运行
SELECT @@internal_tmp_mem_storage_engine;查看当前设置 - 若返回
MEMORY,说明配置未更新或版本不满足;若为TEMPTABLE,则进入下一步调优
推荐配置:显式设为 TEMPTABLE 并联动调参
即使默认已是 TEMPTABLE,也建议在配置文件中明确声明,并配合关键参数协同优化:
- 在
my.cnf的[mysqld]段添加:internal_tmp_mem_storage_engine = TEMPTABLE - 同步设置内存上限:
temptable_max_ram = 1G(默认值,可根据可用内存调整为 512M~2G) - 确保
tmp_table_size和max_heap_table_size相等且合理(如 128M),二者取小值会影响 TEMPTABLE 的初始内存分配策略 - 可选:在内存受限或容器环境中关闭 mmap:
temptable_use_mmap = OFF
修改后需重启 MySQL 生效。
避免踩坑:MEMORY 引擎的硬限制仍在
即便设为 TEMPTABLE,仍需注意以下常见误操作:
- 不要误以为
tmp_table_size是 TEMPTABLE 的“最大建表大小”——它只间接影响内存池分配,真正决定是否分页落盘的是temptable_max_ram - 显式创建
CREATE TEMPORARY TABLE ... ENGINE=MEMORY时,仍受 TEXT/BLOB 不支持、固定长度内存占用等限制,这类语句不会自动转为 TEMPTABLE - 若应用中存在硬编码依赖 MEMORY 行为(如 UDF 或存储过程假设无 BLOB 支持),切换前必须测试兼容性
验证优化是否生效
配置生效后,通过组合方式确认效果:
- 执行典型 GROUP BY 或 DISTINCT 查询,再运行:
SHOW STATUS LIKE 'Created_tmp%';
观察Created_tmp_disk_tables增速是否明显下降 - 用
EXPLAIN FORMAT=TREE或EXPLAIN ANALYZE查看执行计划,确认不再出现Using temporary(或出现但实际走内存而非磁盘) - 监控
information_schema.innodb_temp_table_info,确认临时表元数据正常生成,无报错中断











