項目需高速緩存層,考察過 Memcached、Redis、.NET Cache,最終選擇 MySQL Memory 引擎——無需額外代碼、運維成本低。本文整理官方文檔(MySQL 5.5),對比 MySQL Cluster,並給出 InnoDB/MyISAM/Memory/.NET DataTable 實測數據。
| 特性 | 支持 |
|---|---|
| 存儲限制 | RAM |
| 事務 | 否 |
| 鎖粒度 | 表鎖 |
| MVCC | 否 |
| B-tree 索引 | 是 |
| Hash 索引 | 是(默認) |
| 全文索引 | 否 |
| 聚簇索引 | 否 |
| 數據壓縮 | 否 |
| 加密數據 | 是 |
| 集群支持 | 否 |
| 復制支持 | 是 |
| 外鍵 | 否 |
| 備份/時間點恢復 | 是 |
| 查詢緩存 | 是 |
Memory 適用場景: 會話存儲、緩存層、只讀/讀多業務、極速讀寫、可接受重啟數據丟失。
Cluster 優勢:
決策建議: 純緩存/會話、數據可重建、單機足夠 → Memory;核心業務、需持久化、高可用、水平擴展 → Cluster。
CREATE TABLE t (i INT) ENGINE = MEMORY;
-- 等同於舊版 HEAP,但 MEMORY 為首選術語
每張 Memory 表對應一個 .frm 定義文件。重啟後表結構保留,**數據清空**。
CREATE TABLE test ENGINE=MEMORY;
SELECT ip, SUM(downloads) AS down FROM log_table GROUP BY ip;
SELECT COUNT(ip), AVG(down) FROM test;
DROP TABLE test;
USING HASH(默認,等值查詢極快)或 USING BTREE(範圍查詢、高重複鍵值)VARCHAR 存儲為定長 CHAR,**不支持 BLOB/TEXT**max_heap_table_size(默認 16MB)CREATE TABLE 瞬間生效,生命週期內固定ALTER TABLE、TRUNCATE TABLE、重啟服務會重置為全局值SET max_heap_table_size = 1024*1024; 後創建表限 1MB
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。
ALTER TABLE ENGINE=MEMORY 強制重建DELETE/TRUNCATE TABLE/DROP TABLE主庫重啟後 Memory 表清空,從庫不知情仍返回舊數據。主庫首次使用該表時自動寫入 DELETE FROM 到 Binlog 同步從庫。**使用 --init-file 啟動時預熱表,可將不一致窗口縮減為零。**
id INT UNSIGNED AUTO_INCREMENT PK, obj CHAR(255)innodb_flush_log_at_trx_commit=1
// 四引擎分別測試 Insert/Select 耗時(Ticks)
// 完整腳本見原文,此處略


max_heap_table_size,防止單表撐爆內存