Memory存储引擎
Memory(旧称 HEAP)是 MySQL 提供的一种基于内存的存储引擎。
它将所有数据存放在内存中,因此读写速度极快,非常适合需要快速访问的临时数据或中间计算结果。
但由于数据仅存在于内存中,服务器重启或崩溃后,数据会丢失。
1. 存储结构
Section titled “1. 存储结构”Memory 表只会在磁盘上保存表结构定义文件,不会保存数据文件。
| 文件类型 | 后缀名 | 说明 |
|---|---|---|
| 表结构定义 | .frm | 存储表结构定义(字段、索引等) |
| 数据 | — | 所有数据存储在内存中,不在磁盘上持久化 |
2. 索引结构与类型
Section titled “2. 索引结构与类型”2.1. 索引结构
Section titled “2.1. 索引结构”Memory 引擎支持两种索引结构:
| 索引类型 | 描述 |
|---|---|
| HASH 索引(默认) | 基于哈希表结构,查找速度极快;适用于等值查询(=、IN()) |
| BTREE 索引 | 可支持范围查询(<, >, BETWEEN, ORDER BY) |
示例:
CREATE TABLE t_mem ( id INT PRIMARY KEY, name VARCHAR(30), age INT, KEY idx_name (name) USING HASH) ENGINE=MEMORY;也可以手动指定使用 BTREE:
CREATE TABLE t_mem_btree ( id INT PRIMARY KEY, score INT, KEY idx_score (score) USING BTREE) ENGINE=MEMORY;2.2. 索引特征
Section titled “2.2. 索引特征”-
HASH 索引基于哈希表实现(Key → Row Pointer)
-
叶子节点直接保存数据行的内存地址
-
不支持前缀索引(Partial Key Index)
-
不支持全文索引(FULLTEXT)与空间索引(SPATIAL)
3. 数据行存储特性
Section titled “3. 数据行存储特性”Memory 表中的每一行数据都存放在内存中。
默认使用 固定长度(Fixed-Length) 格式存储,因此:
-
VARCHAR字段会被转换为CHAR类型; -
表的记录长度固定;
-
操作效率高,但会浪费一定内存空间。
4. 锁机制与事务支持
Section titled “4. 锁机制与事务支持”| 特性 | 支持情况 |
|---|---|
| 锁机制 | 表级锁(无行锁) |
| 事务 | ❌ 不支持 |
| 外键约束 | ❌ 不支持 |
| 并发性 | 一般,写操作会锁表 |
| 崩溃恢复 | 数据全部丢失(仅保留结构) |
5. 使用限制与配置
Section titled “5. 使用限制与配置”| 限制项 | 说明 |
|---|---|
| 数据易失性 | MySQL 重启后数据丢失 |
| 存储大小 | 受系统内存限制,由参数 max_heap_table_size 控制 |
| 列类型限制 | 不支持 BLOB 和 TEXT 类型 |
| 并发锁 | 仅支持表级锁 |
| 字符串比较 | 大小写敏感性依赖字符集和排序规则(collation) |
6. 适用场景
Section titled “6. 适用场景”| 场景 | 说明 |
|---|---|
| 临时表 | 用于存储中间结果(如排序、汇总计算) |
| 会话缓存 | 存储会话级、连接级中间状态数据 |
| 高速查找表 | 如字典映射表、黑名单表、验证码表 |
| 不适合 | 存储持久业务数据或大数据量表 |
7. 与 InnoDB / MyISAM 对比
Section titled “7. 与 InnoDB / MyISAM 对比”| 项目 | Memory | MyISAM | InnoDB |
|---|---|---|---|
| 数据存储位置 | 内存 | 磁盘(.MYD) | 磁盘(聚簇索引) |
| 默认索引类型 | HASH | B+Tree | B+Tree |
| 事务支持 | ❌ | ❌ | ✅ |
| 锁粒度 | 表级 | 表级 | 行级 |
| 持久性 | 数据丢失 | 数据持久 | 数据持久 |
| 适用场景 | 临时、快速缓存 | 读多写少 | 高并发事务系统 |
Memory 引擎核心特征:
-
数据完全存放在内存中,速度最快;
-
默认使用 HASH 索引;
-
仅支持表级锁,不支持事务与外键;
-
重启后数据丢失,仅保留表结构;
-
适合临时计算、快速缓存、会话数据等高性能场景。