Memory存储引擎
Memory(原名HEAP)存储引擎将数据完全存储在内存中,提供极快的访问速度。
核心特性
内存存储
SQL
CREATE TABLE session_cache (
session_id VARCHAR(64) PRIMARY KEY,
user_id INT,
expire_time DATETIME
) ENGINE=MEMORY;
-- 数据完全在内存中,无磁盘IO
表级锁
SQL
-- Memory引擎使用表级锁,并发写入性能较低
INSERT INTO session_cache VALUES ('abc123', 1, NOW());
固定长度行
SQL
-- Memory引擎不支持BLOB/TEXT,VARCHAR按最大长度存储
CREATE TABLE mem_test (
id INT PRIMARY KEY,
name VARCHAR(100) -- 实际占用100字节,非变长
) ENGINE=MEMORY;
索引支持
Memory引擎支持两种索引类型:
1. HASH索引(默认)
SQL
CREATE TABLE mem_hash (
id INT PRIMARY KEY,
name VARCHAR(50),
KEY idx_name (name) USING HASH
) ENGINE=MEMORY;
-- HASH索引:等值查询快,范围查询不支持
SELECT * FROM mem_hash WHERE name = 'test'; -- 快
SELECT * FROM mem_hash WHERE name > 'a'; -- 慢,全表扫描
2. BTREE索引
SQL
CREATE TABLE mem_btree (
id INT PRIMARY KEY,
name VARCHAR(50),
KEY idx_name (name) USING BTREE
) ENGINE=MEMORY;
-- BTREE索引:支持范围查询
SELECT * FROM mem_btree WHERE name > 'a'; -- 可走索引
| 索引类型 | 等值查询 | 范围查询 | 排序 |
|---|---|---|---|
| HASH | ✅ O(1) | ❌ 不支持 | ❌ |
| BTREE | ✅ O(log n) | ✅ 支持 | ✅ 支持 |
数据持久性
服务重启数据丢失
SQL
-- Memory表数据在服务重启后丢失
-- 但表结构定义保留
mysql> SHOW CREATE TABLE session_cache;
-- 重启后表存在,但无数据
复制场景
SQL
-- 主从复制时,Memory表在从库重启后数据丢失
-- 需要在启动时重新初始化数据
适用场景
| 场景 | 是否适合 |
|---|---|
| 会话缓存 | ✅ 适合 |
| 临时数据分析 | ✅ 适合 |
| 查询结果缓存 | ✅ 适合 |
| 持久化存储 | ❌ 不适合 |
| 大表存储 | ❌ 受内存限制 |
| 高并发写入 | ❌ 表锁限制 |
使用限制
SQL
-- 不支持BLOB/TEXT类型
CREATE TABLE t1 (content TEXT) ENGINE=MEMORY; -- 报错
-- 不支持事务
START TRANSACTION; -- 无效,每条语句自动提交
-- 单表最大受max_heap_table_size限制
SHOW VARIABLES LIKE 'max_heap_table_size';
-- 默认16MB,可调整
SET max_heap_table_size = 256*1024*1024; -- 256MB
Memory表适合小数据量、高频访问、允许丢失的临时数据场景。
要点总结
- Memory引擎数据全在内存,访问速度极快
- 默认HASH索引,等值查询O(1),不支持范围查询
- 服务重启数据丢失,仅保留表结构
- 使用表级锁,不适合高并发写入
- 适合会话缓存、临时数据等场景,不适合持久化存储
📝 发现内容有误?点击此处直接编辑