当前位置: 首页 > 工具软件 > Memory > 使用案例 >

MEMORY存储引擎详解

吕衡
2023-12-01

MEMORY是MySQL中一类非常特殊的存储引擎,与MySQL中其他的存储引擎不同的是MEMORY存储引擎创建包含存储在内存中的内容的专用表。由于数据容易受到崩溃,硬件问题或断电的影响,因此只能将这些表用作临时工作区或从其他表中提取数据的只读缓存。

MEMORY引擎的典型用例涉及以下特征:

1.涉及瞬态非关键数据的操作,例如会话管理或缓存。当MySQL服务器暂停或重新启动时,MEMORY表中的数据将丢失。

2.内存存储,可实现快速访问和低延迟。数据卷可以完全适合内存,而不会导致操作系统交换虚拟内存页。

3.只读或读取是主要数据访问模式(有限更新)。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。

MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

MEMORY性能受到处理更新时单线程执行和表锁开销导致的争用的限制。这会限制负载增加时的可伸缩性,特别是对于包含写的混合语句。尽管对MEMORY表进行了内存处理,但它们不一定比繁忙服务器上的InnoDB表,通用查询或读/写工作负载更快。特别是,执行更新所涉及的表锁定会减慢来自多个会话的MEMORY表的并发使用。根据在MEMORY表上执行的查询类型,您可以创建索引作为默认哈希数据结构(用于基于唯一键查找单个值)或通用B树数据结构(适用于所有类型涉及等于,不等式或范围运算符(例如小于或大于)的查询)。以下部分说明了创建这两种索引的语法。常见的性能问题是在工作负载中使用默认哈希索引,但是B树索引更有效。

MEMORY存储引擎将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。这在某种程度上决定了MEMORY存储引擎的特性:

(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

(3)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

(5)默认使用hash索引。

(6)如果一个内部表很大,会转化为磁盘表。

相对于MySQL数据库的首选存储引擎—InnoDB,MEMORY存储引擎似乎毫无竞争力,但总体而言,MEMORY存储引擎拥有极高的插入,更新和查询效率。

 类似资料: