相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 29.4 mb
PDF (A4)- 29.5 mb
手册(TGZ)- 190.2 kb
手册(Zip)- 304.8 kb
信息(Gzip)- 2.8 mb
信息(邮政编码)- 2.8 mb
本手册节选

15.3内存存储引擎

内存存储引擎(以前称为)创建具有存储在内存中的内容的特殊用途表。因为数据容易受到崩溃、硬件问题或电源中断的影响,所以只能将这些表用作临时工作区或只读缓存,用于从其他表提取的数据。

表15.4内存存储引擎特性

功能 支持
b -树索引 是的
备份/恢复时间点(在服务器中实现,而不是在存储引擎中实现。) 是的
集群数据库支持 没有
聚集索引 没有
压缩数据 没有
数据缓存 N/A
加密的数据 是(通过加密功能在服务器端实现)
外键支持 没有
全文检索索引 没有
地理空间数据类型支持 没有
地理空间索引支持 没有
散列索引 是的
索引缓存 N/A
锁的粒度 表格
MVCC 没有
复制支持(在服务器中实现,而不是在存储引擎中实现。) 有限的(请参阅本节后面的讨论)。
存储限制 内存
-树索引 没有
交易 没有
更新数据字典的统计信息 是的

何时使用内存或NDB集群

方法部署应用程序的开发人员内存对于重要的、高可用性或频繁更新的数据,存储引擎应该考虑NDB集群是否是一个更好的选择。的典型用例内存引擎包含以下特性:

  • 涉及临时、非关键数据的操作,如会话管理或缓存。当MySQL服务器停止或重新启动时,数据将保存在数据库中内存表丢失。

  • 内存存储,快速访问和低延迟。数据卷可以完全放入内存中,而不会导致操作系统交换虚拟内存页。

  • 只读或以读为主的数据访问模式(有限更新)。

新db集群提供与内存具有更高的性能级别的引擎,并提供了附加的功能内存

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

  • 可伸缩性,甚至可以使用包含写的语句混合。

  • 可选磁盘备份操作的数据持久性。

  • 无共享架构和多主机操作,无单点故障,实现99.999%的可用性。

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

  • 支持变长数据类型(包括而且文本)不受内存

性能特征

内存在处理更新时,由于单线程执行和表锁定开销导致的争用限制了性能。当负载增加时,这限制了可伸缩性,特别是对于包含写的混合语句。

尽管在内存中处理内存表,它们不一定比InnoDB繁忙服务器上的表、用于通用查询的表或读写工作负载下的表。特别是,执行更新所涉及的表锁定会降低并发使用内存来自多个会话的表。

的查询类型内存表中,您可以将索引创建为默认的散列数据结构(用于根据惟一键查找单个值),或通用的b -树数据结构(用于涉及相等、不相等或范围操作符(如小于或大于)的各种查询)。下面几节演示创建这两种索引的语法。一个常见的性能问题是在b树索引效率更高的工作负载中使用默认哈希索引。

内存表的特点

内存存储引擎将每个表与一个存储表定义(而不是数据)的磁盘文件关联起来。文件名以表名开头,扩展名为.frm

内存表有以下特点:

  • 的空间内存表按小块分配。表对插入使用100%动态哈希。不需要溢出区域或额外的键空间。空闲列表不需要额外的空间。删除的行被放入一个链表中,并在向表中插入新数据时重用。内存在哈希表中,表也没有通常与删除和插入相关的问题。

  • 内存表使用固定长度的行存储格式。变长类型,例如VARCHAR使用固定长度存储。

  • 内存表不能包含文本列。

  • 内存包括对AUTO_INCREMENT列。

  • 临时内存表在所有客户机之间共享,就像任何其他非临时表格

内存表的DDL操作

要创建一个内存表中,指定子句记忆引擎=创建表声明。

创建表t (INT) =内存

如发动机名称所示,内存表存储在内存中。默认情况下,它们使用散列索引,这使得它们在单值查找时非常快速,在创建临时表时非常有用。但是,当服务器关闭时,存储在内存桌子丢失了。表本身继续存在,因为它们的定义存储在.frm磁盘上的文件,但是当服务器重新启动时它们为空。

该示例演示如何创建、使用和删除内存表:

mysql>创建表测试引擎=内存SELECT ip,SUM(下载)AS down FROM log_tab10bet手机中文版le GROUP BY ip;mysql> SELECT COUNT(ip),AVG(down) FROM test;mysql>删除表

的最大尺寸内存表受max_heap_table_size系统变量,默认值为16MB。执行不同的大小限制内存表中,更改此变量的值。有效的值创建表,或其后ALTER TABLE截断表,是用于表寿命的值。服务器重新启动还会设置现有的最大大小内存表到全局max_heap_table_size价值。您可以设置单个表的大小,如本节后面所述。

索引

内存存储引擎同时支持哈希而且BTREE索引。可以为给定的索引指定一个或另一个使用条款如下:

创建表查询(id INT,索引使用HASH (id))创建表查询(id INT,索引使用BTREE (id))

有关b -树和哈希索引的一般特征,请参见第8.3.1节“MySQL如何使用索引”

内存每个表最多可以有64个索引,每个索引有16个列,键的最大长度为3072字节。

如果一个内存表哈希索引有高度的键重复(许多索引项包含相同的值),对表的更新会影响键值,所有删除都明显较慢。这种减速的程度与复制的程度成正比(或者,与索引基数成反比)。你可以使用BTREE索引来避免这个问题。

内存表可以有非唯一的键。(这是哈希索引实现中不常见的特性。)

索引的列可以包含值。

用户创建表和临时表

内存表内容存储在内存中,这是一个属性内存表与服务器在处理查询时动态创建的内部临时表共享。然而,这两种类型的表在这一点上有所不同内存表不受存储转换的影响,而内部临时表是:

加载数据

在一个内存当MySQL服务器启动时,可以使用init_file系统变量。例如,您可以放入这样的语句插入…选择加载数据装入文件中以从持久数据源加载表,并使用init_file为文件命名。看到第5.1.7节,“服务器系统变量”,第13.2.6节“LOAD DATA语句”

将数据加载到内存由其他会话并发访问的表,内存支持插入延迟.看到第13.2.5.3节,“插入延迟语句”

内存表和复制

当复制源服务器关闭并重新启动时,其内存桌子变空了。要将此效果复制到副本,源第一次使用给定的内存表启动后,它将记录一个事件,该事件通知副本必须通过写入删除语句将该表添加到二进制日志中。当复制服务器关闭并重新启动时,其内存表也变成空的,它写一个删除语句到它自己的二进制日志中,该日志被传递到任何下游副本。

当你使用内存复制拓扑中的表,在某些情况下,源上的表和副本上的表可能不同。有关处理这些情况以防止过时读取或错误的信息,请参见第17.4.1.20节“复制和内存表”

管理内存使用

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

中删除单个行,则不会回收内存内存表格只有在删除整个表时才回收内存。以前用于删除的行的内存被重用用于同一个表中的新行。对象使用的所有内存内存表中不再需要其内容时,执行删除截断表删除所有行,或删除表的全部使用删除表.若要释放已删除行所使用的内存,请使用修改表引擎=内存强制表重新构建。

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

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

对齐()表示汇总因子,以使行长度为字符指针的大小。sizeof (char *)在32位计算机上是4,在64位计算机上是8。

如前所述,max_heap_table_size的最大大小的限制内存表。要控制单个表的最大大小,请在创建每个表之前设置此变量的会话值。(不要更改全局变量max_heap_table_size值,除非您打算将该值用于内存由所有客户端创建的表。)下面的示例创建了两个内存表,最大大小分别为1MB和2MB:

SET max_heap_table_size = 1024*1024;查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;mysql> SET max_heap_table_size = 1024*1024*2;查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;查询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