MySQL 執行複雜查詢 (GROUP BY、ORDER BY、JOIN) 時會建立臨時表。若臨時表超過 tmp_table_size/max_heap_table_size 或包含 TEXT/BLOB 欄位,MySQL 會將其轉為磁碟 MyISAM 表,導致大量磁碟 I/O。將 tmpdir 掛載至記憶體檔案系統 tmpfs,可徹底消除此瓶頸。
mysql> SHOW GLOBAL STATUS LIKE 'Created_tmp%tables';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Created_tmp_disk_tables | 49094 | -- 磁碟臨時表數 (需關注)
| Created_tmp_tables | 37842181 | -- 總臨時表數
+-------------------------+----------+
mysql> SHOW GLOBAL VARIABLES LIKE '%table_size';
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| max_heap_table_size | 25165824 | -- 24MB
| tmp_table_size | 25165824 | -- 24MB
+---------------------+----------+
mysql> SHOW GLOBAL VARIABLES LIKE 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp | -- 預設磁碟目錄
+---------------+-------+
mkdir -p /mnt/ramdisk
chown mysql:mysql /mnt/ramdisk
mount -t tmpfs -o size=2G tmpfs /mnt/ramdisk
tmpfs /mnt/ramdisk tmpfs rw,mode=1777,size=2G 0 0
[mysqld]
tmpdir = /mnt/ramdisk
systemctl restart mysqld
mysql> SHOW GLOBAL VARIABLES LIKE 'tmpdir';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tmpdir | /mnt/ramdisk |
+---------------+--------------+
運行高負載查詢後,觀察 Created_tmp_disk_tables 不再增長,查詢延遲顯著下降。
size=2G 為上限,實際佔用隨寫入動態增長;需預留足夠記憶體給 InnoDB Buffer Pool 與 OS。效能提升預期: 臨時表密集型負載 (大報表、ETL、複雜 JOIN) 可見 **2-10x** 查詢加速,磁碟 IOPS 壓力近乎歸零。