MySQL 執行複雜查詢(GROUP BY、ORDER BY、JOIN、子查詢)時會創建臨時表:
通過 SHOW GLOBAL STATUS LIKE 'Created_tmp%tables' 可見比例:
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Created_tmp_disk_tables | 49094 |
| Created_tmp_tables | 37842181 |
+-------------------------+----------+
上例磁盤臨時表佔比約 0.13%,但高並發下絕對值大時 I/O 壓力劇增。
| 參數 | 默認值 | 作用 |
|---|---|---|
tmp_table_size | 16M/24M | 內存臨時表最大大小,超過則轉磁盤。 |
max_heap_table_size | 16M/24M | MEMORY 表最大大小,兩者取較小值生效。 |
注意: 含 TEXT/BLOB 列的查詢無法使用 MEMORY 表,直接落磁盤,計入 Created_tmp_disk_tables。
mkdir -p /mnt/ramdisk
chown mysql:mysql /mnt/ramdisk
mount -t tmpfs -o size=512M tmpfs /mnt/ramdisk
tmpfs /mnt/ramdisk tmpfs rw,mode=1777,size=512M 0 0
[mysqld]
tmpdir = /mnt/ramdisk
mysql> SHOW VARIABLES LIKE 'tmpdir';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tmpdir | /mnt/ramdisk |
+---------------+--------------+
| 風險 | 對策 |
|---|---|
| 內存耗盡觸發 OOM Killer | 嚴格限制 size= 參數,預留 30%+ 內存給 OS/InnoDB Buffer Pool。 |
| 重啟丟失臨時數據 | 臨時表本身無需持久化,重啟後自動重建,業務無感。 |
| 大查詢撐爆 tmpfs | 調大 tmp_table_size/max_heap_table_size 配合 tmpfs 容量;或優化 SQL 避免大臨時表。 |
ramfs:不支援大小限制、不支援 Swap,易撐爆內存,**不推薦**。SSD/NVMe 專用分區:次於 tmpfs,但優於機械盤,適合內存受限環境。一句話總結: 給 MySQL 臨時目錄掛載限容量 tmpfs,是「低成本、高收益、零代碼改動」的查詢加速銀彈。