如何通过优化tmp_table_size配置加速MySQL内部内存临时表计算?

小明大大_2410

小明大大_2410

2026-10-21

650人浏览

原创

必须将tmp_table_size与max_heap_table_size设为相等值(如均为128m),因mysql取二者较小值作为内存临时表硬性上限,不一致会导致意外落盘、created_tmp_disk_tables激增及oom风险。

如何通过优化tmp_table_size配置加速mysql内部内存临时表计算?

只调 tmp_table_size 基本无效,必须让它和 max_heap_table_size 完全相等,否则 MySQL 永远按两者中较小值来卡内存上限。

为什么改了 tmp_table_size 却没效果?

MySQL 创建内部临时表时,并不只看 tmp_table_size。它同时检查 tmp_table_size 和 max_heap_table_size,取其中更小的那个作为实际内存上限。线上常见配置是把 tmp_table_size 改成 256M,但 max_heap_table_size 还卡在默认 16M——结果所有查询仍被截断在 16M,Created_tmp_disk_tables 照样飙升。

典型错误现象包括:

  • SHOW PROCESSLIST 中长期显示 Creating tmp table 状态
  • 慢查询日志里频繁出现 Copying to tmp table
  • ERROR 1114 (HY000): The table is full 报错(尤其在 GROUP BY 或 UNION 场景)

怎么安全地设对两个参数?

必须同步设置,且优先走配置文件而非仅靠 SET GLOBAL。因为 SET GLOBAL 不影响已建立的连接,而生产环境连接池往往复用长连接,旧值会持续生效。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 在 /etc/my.cnf 的 [mysqld] 段显式写死两者:
    tmp_table_size = 128M<br>max_heap_table_size = 128M
  • 重启后立即验证:SELECT @@tmp_table_size, @@max_heap_table_size;,确保返回值完全一致
  • 如果用 RDS(如阿里云),注意 loose_rds_max_tmp_disk_space 限制(默认 10GB),即使内存够,磁盘临时表总量超限也会报错
  • 单次调大不宜超过物理内存的 10%~15%,例如 64G 机器建议从 128M 起步;并发连接数高时,要估算总内存占用:Threads_connected × tmp_table_size

调完还是落盘?先排除强制磁盘路径

参数设对了但 Created_tmp_disk_tables 不降,大概率不是内存不够,而是 SQL 本身触发了“强制落盘”逻辑——这时再调参毫无意义。

  • 只要 SELECT 列里含 TEXT、BLOB 或定义过宽的 VARCHAR(2000),MySQL 就直接跳过内存表,哪怕你设成 1G
  • GROUP BY JSON_EXTRACT(col, '$.name')、ORDER BY UPPER(name) 这类带函数的字段,无法用索引加速,也强制走磁盘
  • 执行计划里出现 Using temporary 但没配对应索引,或 UNION 各子查询列类型不一致(触发隐式转换),都会绕过内存路径
  • 检查 SELECT @@tmpdir; 对应磁盘分区是否真有空间,ibtmp1 文件可能已占满且不会自动收缩

比调参更值得优先做的三件事

参数只是兜底,真正省掉临时表得从 SQL 和索引入手:

  • 给 GROUP BY 或 ORDER BY 字段建联合索引,让 MySQL 直接流式分组/排序,跳过临时表
  • 避免 SELECT *,只查真正需要的字段;多一个没用的 TEXT 字段就足以让整个中间结果强制落盘
  • 嵌套查询优先改写为 JOIN,尤其当子查询条件能和外层关联时;IN (SELECT ...) 在无索引场景下极易物化成大临时表

最常被忽略的一点:tmp_table_size 是 SESSION 级变量,连接池复用连接时,SET SESSION 只对当前会话有效,下次获取连接又回到全局默认值——所以配置文件固化才是生产环境唯一可靠方式。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4403

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1149

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6341

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3143

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6300

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8581

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1170

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1012

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习