相关文件10bet官方网站 下载本手册 从本手册中摘录

16.3内存存储引擎

记忆存储引擎(以前称为)使用存储在内存中的内容创建专用表。由于数据很容易受到崩溃,硬件问题或停电,因此只使用这些表作为临时工作区域或从其他表中拉动的数据的只读缓存。

表16.4内存存储引擎功能

特征 支持
B树索引 是的
备份/时间点恢复(在服务器中实现,而不是在存储引擎中。) 是的
群集数据库支持
聚集索引
压缩数据
数据库库 N / A.
加密数据 是(通过加密函数在服务器中实现。)
外国钥匙支持
全文搜索索引
地理空间数据类型支持
地理空间索引支持
哈希索引 是的
索引缓存 N / A.
锁定粒度 桌子
MVCC.
复制支持(在服务器中实现,而不是在存储引擎中。) 有限(见本节后面的讨论。)
存储限制 内存
T树索引
交易
更新数据字典的统计信息 是的

何时使用内存或NDB群集

寻找部署使用的应用程序的开发人员记忆用于重要的,高可用性或经常更新的数据的存储引擎应考虑NDB群集是否是更好的选择。典型的用例记忆发动机涉及这些特征:

  • 涉及暂行,非关键数据(如会话管理或缓存)的操作。当MySQL Server停止或重新启动时,数据记忆表丢失了。

  • 内存存储以快速访问和低延迟。数据量可以完全适合内存而不会导致操作系统交换虚拟内存页面。

  • 只读或读取大多数数据访问模式(有限的更新)。

NDB群集提供与此相同的功能记忆具有更高性能水平的发动机,提供了不可用的其他功能记忆

  • 行级锁定和客户端之间低争用的多线程操作。

  • 即使具有包含写入的语句混音,也可扩展性。

  • 可选的磁盘备份操作,用于数据耐用性。

  • 共享 - 无限制的架构和多主机操作,没有单点故障,启用99.999%可用性。

  • 跨节点的自动数据分布;应用程序开发人员不需要Craft自定义分片或分区解决方案。

  • 支持可变长度数据类型(包括斑点文本)不支持记忆

分区

记忆表无法分区。

性能特点

记忆性能受到单线程执行而导致的争用和处理更新时的开销产生的争用。这限制了加载增加时的可扩展性,特别是对于包括写入的语句混合。

尽管内存处理了记忆表格,它们不一定比Innodb.繁忙服务器上的表,用于通用查询,或在读/写工作量下。特别是,涉及执行更新的表锁定可以减慢并发使用记忆来自多个会话的表格。

取决于对A执行的查询种类记忆表,您可能会创建索引作为默认哈希数据结构(用于根据唯一键查找单个值),或者是通用B树数据结构(用于涉及平等,不等式或范围运算符的所有类型查询如小于或大于)。以下部分说明了用于创建两种索引的语法。常见的性能问题使用Workloads中的默认哈希索引,其中B树索引更有效。

记忆表的特征

记忆存储引擎不会在磁盘上创建任何文件。表定义存储在MySQL数据字典中。

记忆表具有以下特征:

  • 空间记忆表在小块中分配。表使用100%动态散列用于插入。不需要溢出区域或额外的关键空间。免费列表不需要额外的空间。将删除的行放在链接列表中,并在将新数据插入表时重用。记忆表也​​不具有与删除表中的删除和删除插件共同关联的问题。

  • 记忆表使用固定长度的行存储格式。可变长度类型如varchar.使用固定长度存储。

  • 记忆表不能包含斑点或者文本列。

  • 记忆包括支持自动递增列。

  • 非-暂时的记忆表格在所有客户端中共享,就像任何其他非暂时的桌子。

用于内存表的DDL操作

创建一个记忆表格,指定条款引擎=内存在这一点创建表陈述。

创建表T(i int)引擎=内存;

如引擎名称所示,记忆表存储在内存中。默认情况下,它们使用哈希索引,这使得它们非常快速地用于单值查找,并且非常有用地创建临时表。但是,当服务器关闭时,存储的所有行记忆表丢失了。表本身继续存在,因为它们的定义存储在MySQL数据字典中,但在服务器重新启动时它们是空的。

此示例显示如何创建,使用和删除a记忆桌子:

MySQL> Create Table Test Engine = Memory选择IP,Sum(下载)从10bet手机中文版log_table组按IP;MySQL>从测试中选择Count(IP),AVG(DOWN);mysql>删除表测试;

最大尺寸记忆桌子受到限制max_heap_table_size.系统变量,默认值为16MB。强制执行不同的大小限制记忆表,更改此变量的值。有效的价值创建表,或随后的改变表或者截断表,是桌子寿命的价值。服务器重新启动还设置现有的最大大小记忆全球的表格max_heap_table_size.价值。您可以设置本节后面描述的各个表的大小。

索引

记忆存储引擎支持哈希Btree.索引。您可以通过添加一个给定索引指定一个或另一个使用条款如下所示:

创建表查找(ID int,索引使用哈希(ID))引擎=内存;创建表查找(使用Btree(ID))引擎=内存的表查找(ID intex;

对于B树和哈希索引的一般特征,见第8.3.1节“MySQL如何使用索引”

记忆表每表最多可包含64个索引,每索引16列,最大键长度为3072字节。

如果一个记忆表哈希索引具有高度的密钥复制(许多包含相同值的索引条目),对影响密钥值的表格更新,并且所有删除​​都显着较慢。这种放缓的程度与复制程度(或与索引基数成反比)成比例。你可以使用一个Btree.索引避免这个问题。

记忆表格可以具有非纯键。(这是哈希索引实现的一个罕见的特征。)

索引的列可以包含空值价值观。

用户创建和临时表

记忆表内容存储在内存中,这是一个属性记忆表与内部临时表共享,即处理查询时服务器在飞行中创建。但是,这两种类型的表格不同记忆表不受存储转换的影响,而内部临时表是:

  • 如果内部临时表变得太大,则服务器会自动将其转换为磁盘存储,如下所述第8.4.4节“MySQL内部临时表”

  • 用户创建的记忆表永远不会转换为磁盘表。

加载数据中

填充A.记忆表当MySQL Server启动时,可以使用init_file.系统变量。例如,您可以放置​​诸如此类的陈述插入...选择或者加载数据进入文件以从持久性数据源加载表,并使用init_file.命名文件。看第5.1.8节“服务器系统变量”。, 和第13.2.7节“加载数据声明”

内存表和复制

当复制源服务器关闭并重新启动时,其记忆表变空。要将这种效果复制到副本,第一次使用给定的源记忆Startup后表,它会记录一个通知副本的事件,即必须通过写作一个表来清空表删除或(来自MySQL 8.0.22)截断表该表到二进制日志的陈述。当副本服务器关闭并重新启动时,其记忆表也​​变为空,它写了一个删除或(来自MySQL 8.0.22)截断表对其自己的二进制日志的语句,它将传递给任何下游副本。

当你使用时记忆复制拓扑中的表,在某些情况下,源上的表和副本上的表格可以不同。有关处理每种情况的信息以防止陈旧读取或错误,请参阅第17.5.1.21节“复制和记忆表”。

管理内存使用

服务器需要足够的内存来维护所有内存记忆同时使用的表。

如果您从a中删除单个行,则不会回收内存记忆桌子。仅在删除整个表时才会回收内存。以前用于删除行的内存重新用于同一表中的新行。释放a使用的所有内存记忆表当您不再需要其内容时,执行删除或者截断表要删除所有行,或者删除表格使用下拉表。释放已删除的行使用的内存,使用更改表引擎=内存强制桌面重建。

一行中需要的内存记忆表是使用以下表达式计算的:

sum_over_all_btree_keys(max_length_of_key.+ sizeof(char *)* 4)+ sum_over_all_hash_keys(sizeof(char *)* 2)+对齐(length_of_row.+1,sizeof(char *))

对齐()表示圆形因素,使行长度是精确的倍数char指针大小。sizeof(char *)在32位机器上是4个,64位机器上的8台。

如前所述,max_heap_table_size.系统变量设置最大大小的限制记忆表。要控制各个表的最大大小,请在创建每个表之前设置此变量的会话值。(不要改变全球max_heap_table_size.除非您打算用于要使用的值记忆所有客户端创建的表。)以下示例创建两个记忆桌子,最大尺寸为1MB和2MB:

mysql> set max_heap_table_size = 1024 * 1024;查询确定,0行受影响(0.00秒)MySQL> Create Table T1(ID Int,唯一(ID))引擎=内存;查询OK,0行受影响(0.01秒)MySQL> Set Max_heap_table_size = 1024 * 1024 * 2;查询确定,0行受影响(0.00秒)MySQL> Create Table T2(ID,唯一(ID))引擎=内存;查询OK,影响0行(0.00秒)

两个表都恢复到服务器的全局max_heap_table_size.如果服务器重新启动值。

您还可以指定一个max_rows.表选项创建表陈述记忆表可以提供关于您计划存放在其中的行数的提示。这并不能使表格扩大max_heap_table_size.值,它仍然是最大表大小的约束。为了能够使用的最大灵活性max_rows., 放max_heap_table_size.至少与您想要的值一样高记忆表可以增长。

额外资源

一个致力于的论坛记忆存储引擎可用https://forums.10bet靠谱mysql.com/list.php?92