MySQL 記憶體表(ENGINE=MEMORY,舊稱 HEAP)將所有資料存放於記憶體中,讀寫速度極快。其最大容量由 max_heap_table_size 參數控制(預設 16MB,可調大)。注意:它與臨時表不同——臨時表超過 tmp_table_size 會自動轉為磁碟表(MyISAM),導致性能驟降;而記憶體表滿時直接報錯「Table is full」。
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
state CHAR(10),
type CHAR(20),
date CHAR(30)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
提示: MySQL 5.5+ 已棄用 TYPE 關鍵字,請統一使用 ENGINE。
| 特性 | 說明 |
|---|---|
| 表結構持久化 | .frm 檔案存放於磁碟,重啟後結構保留,但資料會遺失 |
| 固定行長度 | 採用固定長度儲存格式,不支援 BLOB/TEXT(含 VARCHAR 超過 255 字元) |
| 索引支援 | 支援 HASH(預設)與 BTREE 索引;支援 AUTO_INCREMENT、NULL 值索引、>/< 範圍查詢(網上流傳不支援為誤區) |
| 共享性 | 所有客戶端連線共享同一張表(非 TEMPORARY 表特性) |
| 鎖粒度 | 表級鎖,高併發寫入時性能下降明顯 |
| 事務支援 | 不支援事務 |
| 複寫行為 | 主庫掛掉時,Binlog 自動寫入 DELETE FROM memory_table 以確保主從一致性 |
--init-file=/path/init.sql,腳本中載入基礎資料。-- InnoDB 轉 MyISAM
ALTER TABLE `tablename` ENGINE = MYISAM;
-- MyISAM 轉 InnoDB (5.5+)
ALTER TABLE `tablename` ENGINE = InnoDB;
記住:記憶體表是「快但脆」的利器,善用其速度優勢,必須配合完善的資料恢復機制,才能在生產環境中穩健運行。