MySQL 系統會在記憶體(MEMORY)和磁碟(MyISAM)中建立暫存資料表,如何能知道在磁碟中建立了多少暫存資料表以及在記憶體中建立多少暫存資料表呢?你可以通過下面命令獲知:
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 |
| tmp_table_size | 25165824 |
+---------------------+----------+
如果暫存資料表的大小比上述值小,則放於記憶體中的 MEMORY 表;如果比上述值大則存放於磁碟中的 MyISAM 表。
但還有一個其他的因素會導致存放到磁碟的 MyISAM 表,那就是 MEMORY 表不能處理 TEXT 和 BLOG 類型資料。這種情況下 MySQL 會直接寫入磁碟中的 MyISAM,並算作是 Created_tmp_disk_tables 的值。
如果暫存資料表已經開始導致嚴重的 I/O 效能問題,那麼你就要考慮使用磁碟記憶體映射來代替物理磁碟。
在 Linux 上我們有兩種方法在記憶體中建立 RAM-Disk,分別是 ramfs 和 tmpfs。
這裡我們推薦使用 tmpfs。
可通過如下命令來建立 RAM-disk:
shell> mkdir -p /mnt/ramdisk
shell> chown mysql:mysql /mnt/ramdisk
shell> mount -t tmpfs -o size=512M tmpfs /mnt/ramdisk
為了在系統下次啟動時自動建立,我們可以將下列指令碼置於 /etc/fstab 檔案中:
tmpfs /mnt/ramdisk tmpfs rw,mode=1777 0 0
MySQL 還是將資料寫到預設的磁碟,可通過下面命令來檢查:
mysql> SHOW GLOBAL VARIABLES LIKE 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp |
+---------------+-------+
你可以修複 my.cnf 檔案來改變這個路徑,然後重啟資料庫。