專案因快取需求評估 Memory 引擎,過程中發現官方文檔僅提供英文版,且網路中文資料多有過時或片面。本文系統譯解 MySQL 5.5 官方文檔 The MEMORY Storage Engine 章節,並補充架構對比、適用場景與避坑指南,作為技術選型參考。
MEMORY 存儲引擎將表的數據存放在內存中。MEMORY 替代以前的 HEAP 成為首選項,但同時向下兼容,HEAP 仍被支持。
.frm 結構檔)。官方白皮書 Scaling Web Services with MySQL Cluster 指出:NDB 在功能超集上完勝 Memory,若新架構可考慮直接採用 NDB。
| 能力維度 | MEMORY | MySQL Cluster (NDB) |
|---|---|---|
| 行鎖/高並發寫入 | ❌ 表鎖 | ✅ 行鎖、分散式架構 |
| 資料持久化 | ❌ 僅記憶體 | ✅ 可選磁碟持久化 |
| 高可用性 | ❌ 單點 | ✅ 99.999% Shared-nothing |
| 自動分區/分片 | ❌ 需應用層處理 | ✅ 原生自動分片 |
| 變長型別 (BLOB/TEXT) | ❌ 不支援 | ✅ 完整支援 |
| 部署複雜度 | ✅ 極低 | ⚠️ 較高(多節點協調) |
| 特性 | 支援 | 備註 |
|---|---|---|
| 儲存空間限制 | RAM | 受 max_heap_table_size 控制 |
| 交易 | ❌ | |
| 鎖粒度 | Table | 表級鎖 |
| MVCC | ❌ | |
| Hash 索引 | ✅ | 預設,等值查詢最快 |
| B-Tree 索引 | ✅ | USING BTREE 指定 |
| 全文索引 | ❌ | |
| 叢集索引 | ❌ | |
| 壓縮資料 | ❌ | |
| 加密資料 | ✅ | 透過伺服器層 |
| 複寫支援 | ✅ | 需注意重啟同步問題 |
| 外鍵 | ❌ | |
| 備份/時間點恢復 | ✅ | 邏輯備份可行 |
| 查詢快取 | ✅ |
-- 基本建表
CREATE TABLE t (id INT, data VARCHAR(100)) ENGINE = MEMORY;
-- 指定 Hash 索引(預設)
CREATE TABLE lookup (id INT, INDEX USING HASH (id)) ENGINE = MEMORY;
-- 指定 B-Tree 索引(支援範圍查詢、ORDER BY)
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
索引選擇原則: 等值查詢(=, IN)→ Hash;範圍/排序(>, <, BETWEEN, ORDER BY)→ B-Tree。高重複度鍵值下 Hash 索引更新/刪除效能急劇下降,必須改用 B-Tree。
VARCHAR(255) 實際佔用 255 字元空間,CHAR 與 VARCHAR 無差異。AUTO_INCREMENT、INSERT DELAYED、NULL 欄位索引。ALTER TABLE ... ENGINE=MEMORY 重建或 TRUNCATE/DROP 才釋放。--init-file 載入 INSERT ... SELECT 或 LOAD DATA。單行記憶體估算公式(官方文檔):
SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)
+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)
+ ALIGN(length_of_row + 1, sizeof(char*))
sizeof(char*):32位系統 4 位元組,64位系統 8 位元組。ALIGN:向上對齊至指標大小倍數。-- 設定下一個 CREATE TABLE 的上限為 1MB
SET SESSION max_heap_table_size = 1024*1024;
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE = MEMORY;
-- 設定下一個為 2MB
SET SESSION max_heap_table_size = 1024*1024*2;
CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE = MEMORY;
注意: max_heap_table_size 優先級高於 MAX_ROWS。重啟後所有表恢復全域設定值。
DELETE FROM 至 Binlog,從庫同步清空。--init-file 啟動時自動重建 Memory 表,風險窗口歸零。
資料是否允許遺失(重啟/故障)?
├─ 否 → ❌ 禁用 MEMORY,改用 InnoDB/NDB
└─ 是 → 訪問模式為何?
├─ 純快取/Session/暫存 → ✅ MEMORY 首選
├─ 讀多寫少、需持久化 → ⚠️ 評估 MyISAM/InnoDB + 大記憶體緩衝池
└─ 高並發寫入、混合負載 → ❌ MEMORY 表鎖瓶頸,改用 InnoDB/NDB


Memory 引擎是把「雙刃劍」:用對場景(快取、Session、可重建暫存資料)能發揮極致速度;用錯場景(核心業務資料、高並發寫入、需持久化)將釀成災難。選型前請嚴格套用上述判斷樹,並做好容量規劃與監控告警。