內部臨時表最大內存限制 = MIN(tmp_table_size, max_heap_table_size)。兩者中較小值決定臨時表何時從內存 (MEMORY 引擎) 轉為磁盤 (MyISAM/InnoDB)。
| 參數 | 作用域 | 默認值 | 影響對象 | 動態修改 |
|---|---|---|---|---|
tmp_table_size | Global / Session | 16MB (5.7) / 16MB (8.0) | 優化器創建的內部臨時表 (GROUP BY, ORDER BY, UNION, 子查詢等) | 是 |
max_heap_table_size | Global / Session | 16MB | 用戶顯式創建的 MEMORY 引擎表 (CREATE TABLE ... ENGINE=MEMORY) | 是 (僅影響新建表) |
MIN(tmp_table_size, max_heap_table_size)。TEXT/BLOB 列 (MEMORY 引擎不支援,直接用磁盤表)。UNION / UNION ALL 涉及大列。SHOW GLOBAL STATUS LIKE 'Created_tmp_%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_tables | 15000 | -- 內存臨時表總數 | Created_tmp_disk_tables | 300 | -- 轉磁盤臨時表總數 +-------------------------+-------+
健康閾值: Created_tmp_disk_tables / Created_tmp_tables < 5% (理想 < 1%)。超過說明內存不足頻繁落盤,I/O 開銷大,需調優。
# /etc/my.cnf tmp_table_size = 64M max_heap_table_size = 64M
max_heap_table_size 只影響 新建 MEMORY 表的最大行數限制,已存在表需 ALTER TABLE ... ENGINE=MEMORY 重建生效。internal_tmp_disk_storage_engine 控制 (默認 InnoDB),InnoDB 支持行鎖、緩衝池,性能優於 MyISAM。8.0 引入 temptable 引擎作為內存臨時表默認引擎 (替代 MEMORY),支援可變長列 (VARCHAR, VARBINARY) 高效存儲,溢出時自動溢寫到磁盤 (InnoDB)。
關鍵參數:temptable_max_ram (默認 1GB),temptable_max_mmap (默認 1GB)。
建議: 8.0 實例重點關注 temptable_max_ram,而非傳統 tmp_table_size。