目录
MEMORY存储引擎
介绍
MEMORY(原HEAP)存储引擎 是 MySQL 提供的一种存储引擎
- 它的核心特点是所有数据存储在内存中,因此具有超高的读写速度
- 但当服务器由于硬件问题 / 断电 / 其他原因崩溃时,数据会丢失
使用场景
适用于保存临时数据,不需要持久化的,访问频率极高但更新不频繁(只读/以读为主)的数据
比如说:
- 一般用于系统创建的临时表(我们一般不会使用)
- 会话数据存储(短期的有效验证码,购物车数据)
- 电子商务平台的实时秒杀商品库存信息
- 实时排行榜
特性
支持的
内存级别,追求高效率
- 所以与效率有关的特性它都支持 -- b+树索引 / 哈希索引(默认类型)
- 哈希索引 -- 适用于等值查询,速度快,但不支持范围查询
使用固定长度的存储格式
- 可变长度类型(例如varchar)也会使用固定长度存储
支持AUTO_INCREMENT的列
非 TEMPORARY 类型的 MEMORY 表在所有客户端之间共享
- 非 TEMPORARY 类型 -- 非临时内存表,也就是正常创建的表
MEMORY 存储引擎使用表级锁定机制
- 在高并发负载下,特别是多个客户端同时执行更新操作时,可能会出现严重的锁竞争,导致性能下降
- 在这种情况下,InnoDB 等支持行级锁的存储引擎可能表现出更好的性能
不支持的
不能包含BLOB或TEXT列
- 不能用于保存博客/论坛的正文部分
不支持表分区
- 表分区 -- 一种磁盘上的操作,将一张大表分为多个小分区,防止表文件过大
- 查询操作只需处理相关的分区,减少了扫描的数据量,从而提高查询效率
操作
创建memory表
- 因为数据在内存中保存,所以磁盘上不会生成数据文件,只会生成一个sdi文件(表结构描述文件)
插入数据
依据查询结果集中的字段初始化表结构,并填充数据
查询两张表,虽然结果相同,但一个是从磁盘中查询,一个是从内存中
重启后重新加载数据
每次重启服务器内存表中的数据将被清空,内存表中的数据永远不会写入磁盘
服务器重启后,表中数据就没有了,如何重新加载?
内存管理
释放内存资源
删除单行数据,不会回收内存,只有删除整个表时才会回收内存
- 当不需要内存表的内容时,要释放该表所使用的所有内存,可以执行DELETE / TRUNCATE table删除所有行
- 或者使用DROP table删除表
如果要释放被删除行所使用的内存,使用ALTER TABLE ENGINE = MEMORY命令强制重建表