的内存
存储引擎(以前称为堆
)创建具有存储在内存中的内容的特殊用途表。因为数据容易受到崩溃、硬件问题或电源中断的影响,所以只能将这些表用作临时工作区或只读缓存,用于从其他表提取的数据。
表16.4内存存储引擎特性
功能 | 支持 |
---|---|
b -树索引 | 是的 |
备份/恢复时间点(在服务器中实现,而不是在存储引擎中实现。) | 是的 |
集群数据库支持 | 没有 |
聚集索引 | 没有 |
压缩数据 | 没有 |
数据缓存 | N/A |
加密的数据 | 是(通过加密功能在服务器端实现) |
外键支持 | 没有 |
全文检索索引 | 没有 |
地理空间数据类型支持 | 没有 |
地理空间索引支持 | 没有 |
散列索引 | 是的 |
索引缓存 | N/A |
锁的粒度 | 表格 |
MVCC | 没有 |
复制支持(在服务器中实现,而不是在存储引擎中实现。) | 有限的(请参阅本节后面的讨论)。 |
存储限制 | 内存 |
-树索引 | 没有 |
交易 | 没有 |
更新数据字典的统计信息 | 是的 |
方法部署应用程序的开发人员内存
对于重要的、高可用性或频繁更新的数据,存储引擎应该考虑NDB集群是否是一个更好的选择。的典型用例内存
引擎包含以下特性:
涉及临时、非关键数据的操作,如会话管理或缓存。当MySQL服务器停止或重新启动时,数据将保存在数据库中
内存
表丢失。内存存储,快速访问和低延迟。数据卷可以完全放入内存中,而不会导致操作系统交换虚拟内存页。
只读或以读为主的数据访问模式(有限更新)。
新db集群提供与内存
具有更高的性能级别的引擎,并提供了附加的功能内存
:
内存
在处理更新时,由于单线程执行和表锁定开销导致的争用限制了性能。当负载增加时,这限制了可伸缩性,特别是对于包含写的混合语句。
尽管在内存中处理内存
表,它们不一定比InnoDB
繁忙服务器上的表、用于通用查询的表或读写工作负载下的表。特别是,执行更新所涉及的表锁定会降低并发使用内存
来自多个会话的表。
的查询类型内存
表中,您可以将索引创建为默认的散列数据结构(用于根据惟一键查找单个值),或通用的b -树数据结构(用于涉及相等、不相等或范围操作符(如小于或大于)的各种查询)。下面几节演示创建这两种索引的语法。一个常见的性能问题是在b树索引效率更高的工作负载中使用默认哈希索引。
的内存
存储引擎没有在磁盘上创建任何文件。表定义存储在MySQL数据字典中。
内存
表有以下特点:
要创建一个内存
表中,指定子句记忆引擎=
在创建表
声明。
创建表t (INT) =内存
如发动机名称所示,内存
表存储在内存中。默认情况下,它们使用散列索引,这使得它们在单值查找时非常快速,在创建临时表时非常有用。但是,当服务器关闭时,存储在内存
桌子丢失了。表本身继续存在,因为它们的定义存储在MySQL数据字典中,但当服务器重新启动时,它们为空。
该示例演示如何创建、使用和删除内存
表:
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
索引来避免这个问题。
内存
表可以有非唯一的键。(这是哈希索引实现中不常见的特性。)
索引的列可以包含零
值。
内存
表内容存储在内存中,这是一个属性内存
表与服务器在处理查询时动态创建的内部临时表共享。然而,这两种类型的表在这一点上有所不同内存
表不受存储转换的影响,而内部临时表是:
如果内部临时表变得太大,服务器会自动将其转换为磁盘存储,如第8.4.4节“MySQL内部临时表的使用”.
用户创建的
内存
从不将表转换为磁盘表。
在一个内存
当MySQL服务器启动时,可以使用init_file
系统变量。例如,您可以放入这样的语句插入…选择
或加载数据
装入文件中以从持久数据源加载表,并使用init_file
为文件命名。看到第5.1.8节,“服务器系统变量”,第13.2.7节“LOAD DATA语句”.
当复制源服务器关闭并重新启动时,其内存
桌子变空了。要将此效果复制到副本,源第一次使用给定的内存
表启动后,它将记录一个事件,该事件通知副本必须通过写入删除
or (from MySQL 8.0.22)截断表
语句将该表添加到二进制日志中。当复制服务器关闭并重新启动时,其内存
表也变成空的,它写一个删除
or (from MySQL 8.0.22)截断表
语句到它自己的二进制日志中,该日志被传递到任何下游副本。
当你使用内存
复制拓扑中的表,在某些情况下,源上的表和副本上的表可能不同。有关处理这些情况以防止过时读取或错误的信息,请参见第17.5.1.21节“复制和内存表”.
服务器需要足够的内存来维护所有文件内存
同时使用的表。
中删除单个行,则不会回收内存内存
表格只有在删除整个表时才回收内存。以前用于删除的行的内存被重用用于同一个表中的新行。对象使用的所有内存内存
表中不再需要其内容时,执行删除
或截断表
删除所有行,或删除表的全部使用删除表
.若要释放已删除行所使用的内存,请使用修改表引擎=内存
强制表重新构建。
中一行所需的内存内存
表使用以下表达式计算:
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.