MySQL Memory 存储引擎浅析(3)

来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 22:00 点击:

(id INT, INDEX USING BTREE (id))

ENGINE = MEMORY;

如果一个MEMORY 表的哈希索引键高度重复(许多索引条目包含相同的值),与索引键相关的更新以及所有的删除将会明显变慢。 重复度与速度成正比,此时你可以使用BTREE 索引来避免这个问题。

MEMORY表能够使用非唯一键。(对哈希索引的实现,这是一个不常用的功能)

对可包含NULL值的列的索引

MEMORY表使用固定的记录长度格式,像VARCHAR这样的可变长度类型将转换为固定长度类型在MEMORY表中存储。

MEMORY不能包含BLOB或TEXT列.

MEMORY支持AUTO_INCREMENT列

MEMORY表支持INSERT DELAYED

非临时的MEMORY表在所有客户端之间共享,就像其它任何非临时表。

MEMORY表内容存储在内存中,它会作为动态查询队列创建内部临时表的共享介质,但是两个类型表的不同在于MEMORY表不会遇到存储转换,而内部表则会:

1、MEMORY表不会转换为磁盘表,而内部临时表如果太大会自动转换为磁盘表。

2、MEMORY表最大值受系统变量max_heap_table_size 限制,默认为16MB,要改变MEMORY表大小限制,需要改变max_heap_table_size 的值。该值在CREATE TABLE 时生效并伴随表的生命周期,(当你使用ALTER TABLE 或TRUNCATE TABLE命令时,表的最大限制将改变,或重启MYSQL服务时, 所有已存在的MEMORY表的最大限制将使用max_heap_table_size 的值重置。)

服务器需要足够内存来维持所有在同一时间使用的MEMORY表。

如果删除行,内存表不会回收内存,只有整张表全部删除的时候,才进行内存回收。同时只有在同一张表中插入新行时才会使用之前删除行的内存空间。 要释放已删除行所占用的内存空间,可以使用ALTER TABLE ENGINE=MEMORY对表进行强制重建。当内容过期要释放整张内存表,可以执行DELETE 或TRUNCATE TABLE清除所有行,或者使用DROP TABLE删除表。

当MySQL服务器启动时,如果你想填充MEMORY表,你可以使用--init-file选项。例如,你可以把INSERT INTO ... SELECT 或LOAD DATA INFILE这样的语句放入这个文件中以便从持久稳固的的数据源装载表。

如果你正使用复制,当主服务器被关闭且重启动之时,主服务器的MEMORY表变空。可是从服务器意识不到这些表已经变空,所以如果你从它们选择数据,它就返回过时的内容。自从服务器启动后,当一个MEMORY表在主服务器上第一次被使用之时,一个DELETE FROM语句被自动写进主服务器的二进制日志,因此再次让从服务器与主服务器同步。注意,即使使用这个策略,在主服务器的重启和它第一次使用该表之间的间隔中,从服务器仍旧在表中有过时数据。可是,如果你使用--init-file选项于主服务器启动之时在其上推行MEMORY表。它确保这个时间间隔为零。

在MEMORY表中,一行需要的内存使用下列公式计算:

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()代表round-up因子,它使得行的长度为char指针大小的确切倍数。sizeof(char*)在32位机器上是4,在64位机器上是8。

如前所述,系统变量max_heap_table_size 用于设置内存表的大小上限。要控制单个表的最大值,需要在创建表之前设置会话变量。(不要设置全局max_heap_table_size 的值,除非你打算所有客户端创建的内存表都使用这个值)

下面的例子创建了两张内存表,它们的大小限制分别为1MB 和2MB:

SET max_heap_table_size = 1024*1024;

/* Query OK, 0 rows affected (0.00 sec) */

 

CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • mysql-mmm
  • mysqldump命令——MySQL数据库备份还原
  • Oracle数据导入MySQL的快捷工具:MySQL Migration Toolkit
  • 简简单单储存过程——循环一个select结果集
  • MySQL数据库十大优化技巧
  • Mysql安装笔记
  • Mysql主主复制架构配置
  • Mysql的Procedure 参数为NULL问题分析
  • MySQL Stmt预处理提高效率问题的小研究
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1