ORDER BY / GROUP BY 需外部排序 (超過 sort_buffer_size)。DISTINCT、UNION、衍生表物化。ALTER TABLE 重建表 (同目錄建立臨時表)。LOAD DATA INFILE、複寫從庫應用 Relay Log。最大磁碟空間 = (排序行長度 + 行指標 4~8 bytes) * 匹配行數 * 2
行指標 32 位系統 4 bytes,64 位系統 8 bytes;大表可能更大。
| 參數 | 說明 | 建議 |
|---|---|---|
tmpdir | 臨時檔案目錄,支援多路徑循環 | 掛載獨立高速磁碟 (NVMe/SSD),多路徑用 : (Linux) / ; (Windows) 分隔 |
slave_load_tmpdir | LOAD DATA 專用目錄 | 同 tmpdir 或獨立 |
sort_buffer_size | 記憶體排序緩衝,超過則落盤 | 256K~2M (每連線),避免 OOM |
[mysqld]
tmpdir = /mnt/ssd1/tmp:/mnt/ssd2/tmp:/mnt/ssd3/tmp
# Windows
tmpdir = D:\tmp;E:\tmp;F:\tmp
原則: 路徑必須位於**不同物理磁碟**,而非同磁碟不同分區,才能真正分散 I/O。
禁止 將 tmpdir 指向記憶體檔案系統 (tmpfs/ramdisk) 或重啟會清空的目錄。
原因:從庫需保留臨時表與 LOAD DATA 檔案以便重啟後繼續複寫,遺失會導致 SQL Thread 中斷、複寫中止。
unlink() 開啟後立即刪除目錄項,僅保留 inode。ls -la、**圖形化檔案管理器均看不見**,df 顯示已用空間卻找不到檔案 → 「隱藏空間」謎團。# 找出 mysqld 開啟的已刪除檔案
lsof -p $(pidof mysqld) | grep deleted
# 或查看 /proc
ls -l /proc/$(pidof mysqld)/fd/ | grep tmp
同原表目錄 (非 tmpdir),故大表重建需確保**資料目錄磁碟剩餘空間 ≥ 表大小 × 2**。
tmpdir。Created_tmp_disk_tables / Created_tmp_files 狀態變數。tmpdir 必須持久化儲存。lsof 排查隱藏空間洩漏。臨時檔案管理雖非核心業務,卻是大查詢效能與磁碟穩定性的關鍵基礎設施。