【MySQL】存储引擎 - MEMORY详解

📢博客主页:https://blog.csdn.net/2301_779549673

📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 JohnKi 原创,首发于 CSDN🙉

📢未来很长,值得我们全力奔赴更美好的生活✨

文章目录


使用 MEMORY 存储引擎(以前称为HEAP)创建的表,内容存储在内存中。当服务器由于硬件问题断电或其他原因崩溃时数据会丢失,因此这些表仅用作 临时工作区从其他表中提取数据的只读缓存

🏳️‍🌈一、使用场景

  • 涉及瞬时、非关键数据的操作,例如会话管理或需要缓存的数据,当服务器停止或重新启动时,MEMORY 表中的数据会丢失:
  • 用于快速访问和低延时,数据量可以完全放在物理内存中,不使用虚拟内存;只读或以读为主的数据访问场景(有限的更新)。

🏳️‍🌈二、 MEMORY存储引擎的特性

  • 使用固定长度的存储格式,可变长度类型,例如 VARCHAR 使用固定长度存储;
  • 不能包含 BLOBTEXT 列;
  • 支持 AUTO_INCREMENT 的列;
  • TEMPORARY MEMORY 表在所有客户端之间共享;
  • 支持 HASH 索引(默认)和 BTREE 索引;
  • 不支持表分区;
  • 由于使用单线程,在高负载的场景下可能会涉及严重的锁竞争,特别是在多个客户端并发执行更新操作的情况下,性能并不一定会比 InnoDB 更快。

🏳️‍🌈三、创建MEMORY表

在MySQL8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=MEMORY:

复制代码
# 创建⼀个使⽤MEMORY存储引擎的表
CREATE TABLE t_memory1 (
	id int(11) PRIMARY KEY AUTO_INCREMENT,
	name varchar(20)
) ENGINE = MEMORY;

创建表并加载数据

启动时填充 MEMORY 表的内容,可以使用 init_file 系统变量指定一个SQL文件,文件中可以编写用于初始化数据的SQL语句,例如: INSERTINTO...SELECTLOAD DATA

🏳️‍🌈四、内存管理

  • 删除单行数据,不会回收内存,只有删除整个表时才会回收内存 。当不需要内存表的内容时,要释放该表所使用的所有内存,可以执行 DELETETRUNCATE table 删除所有行,或者使用 DROP table 删除表。如果要释放被删除行所使用的内存,使用 ALTER TABLE ENGINE=MEMORY 命令强制重建表;

  • 表中一行数据所需的内存使用以下表达式计算:

    涉及到所有BTREE索引⻓度、所有的HASH索引⻓度、单⾏数据⻓度

    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*))

ALIGN()函数的作用:使行长度为char类型大小的精确倍数。sizeof(char*)在32位机器上是4,在64位机器上是8。

  • max_heap_table_size 系统变量设置了内存表的最大大小限制,默认为 16MB,要控制单个表的最大大小,在创建每个表之前设置该变量的 session 值。(不要改变全局的 max_heap_table_size 值,除非要明确设置所有客户端创建的内存表),下面的示例创建了两个内存表,最大大小分别为 1MB2MB:

    指定第⼀张表的内存最⼤值为1MB

    mysql> SET max_heap_table_size = 1024*1024;
    Query OK, 0 rows affected (0.00 sec)
    mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;
    Query OK, 0 rows affected (0.01 sec)

    指定第⼆张表的内存最⼤值为2MB

    mysql> SET max_heap_table_size = 102410242;
    Query OK, 0 rows affected (0.00 sec)
    mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;
    Query OK, 0 rows affected (0.00 sec)

每次重启服务器内存表中的数据将被清空,内存表中的数据永远不会写入磁盘


👥总结

本篇博文对 【MySQL】存储引擎 - MEMORY详解 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

相关推荐
Database_Cool_16 分钟前
阿里云 RDS MySQL vs 腾讯云 CDB 国内云关系型数据库深度对比
数据库·mysql·阿里云
xiaohaiAIgeo16 分钟前
【2026年】基于三维建模的实验室智慧管理平台:暖通能源照明的数字孪生方案
大数据·数据库·人工智能·科普知识
深盾科技_Virbox1 小时前
软件授权工具静默安装实践
java·运维·数据库·安全·软件需求
延凡科技2 小时前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术2 小时前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
醇氧2 小时前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
吴声子夜歌2 小时前
Redis 6.x——整合SpringBoot
数据库·spring boot·redis
ATA88882 小时前
AI辅助生成SQL实战从连接配置到执行计划优化的完整技术流程
数据库·人工智能·智能问数
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
JZC_xiaozhong2 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成