首页/数据/数据库速查/排序与临时表内存(sort_buffer / tmp_table_size)
性能与调优57 条

排序与临时表内存(sort_buffer / tmp_table_size)

排序与临时表内存按会话分配:sort_buffer_size、join_buffer_size、tmp_table_size、max_heap_table_size;不是越大越快,是每连接都要吃的内存。

数据库速查数据更新于 2026-10-13

排序与临时表内存

排序与临时表的内存是按会话分配的,几个参数决定单个会话能用多少:sort_buffer_size 用于 ORDER BY 与 GROUP BY 的排序缓冲,join_buffer_size 用于无索引关联,tmp_table_size 与 max_heap_table_size 则决定内存临时表的上限。核心认知是「不是越大越好」——每个并发连接都会各自申请,把一个参数调大,等于把这份内存乘以并发数。

基本信息

sort_buffer_size排序缓冲,每个需要排序的会话各自分配
join_buffer_size无索引关联的缓冲,一次关联可能分配多次
tmp_table_size内存临时表上限,超出后转为磁盘临时表
max_heap_table_size与上一个参数取较小值生效
观察指标Created_tmp_tables 与 Created_tmp_disk_tables 的占比

典型使用场景

  • 磁盘临时表占比偏高时评估是否值得调参
  • 并发排序导致内存吃紧,需要定位是哪个参数在吃内存
  • 无索引关联造成的重复扫描与缓冲分配
  • 大促前按并发上限估算内存需求
  • 判断应该调参数还是改写 SQL

观察与调整

观察与调整
SHOW STATUS LIKE 'Created_tmp%';
-- Created_tmp_tables 是内存临时表次数
-- Created_tmp_disk_tables 是落到磁盘的次数
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
SHOW VARIABLES LIKE 'sort_buffer_size';
SHOW VARIABLES LIKE 'join_buffer_size';
-- 会话级临时调整,验证效果后再决定是否写进配置
SET SESSION sort_buffer_size = 4*1024*1024;

参数与作用范围

参数作用范围注意事项
sort_buffer_size每个排序会话的缓冲并发高时内存占用线性增长
join_buffer_size每次无索引关联的缓冲一条查询可能出现多次分配
tmp_table_size内存临时表上限与内存表上限取较小值
max_heap_table_size内存表上限只调另一个参数往往无效
Created_tmp_disk_tables磁盘临时表累计次数占比高才真正值得调参
磁盘临时表占比高时才考虑调大 tmp_table_size。更常见的情况是 SQL 本身需要优化:补上合适的索引、减少排序与去重,见效往往比调参数更快也更持久。
两个内存临时表参数取较小值生效:只调 tmp_table_size 而不动 max_heap_table_size,很可能一点效果都没有,动手前先把两个值都查出来。
把 sort_buffer_size 调到几十 MB 是危险操作:一百个并发排序就要占用数 GB 内存,在内存本就紧张的实例上会直接触发 OOM,甚至被系统杀死进程。

易错点

  • 把 sort_buffer_size 调得很大:并发一上来内存被瞬间吃满
  • 忽略两个临时表参数取较小值:调了参数却没有效果
  • 只看磁盘临时表计数就下结论:它是累计值,必须结合业务量看占比
  • 指望调参数解决慢查询:多数情况下应该先优化 SQL 与索引

数据来源与参考

  • MySQL 8.0 Reference Manual: Server System Variables (tmp_table_size)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌