MySQL Memory存储引擎:优势及性能测试

上一篇 /

下一篇  2012-08-10 18:29:44

Memory存储引擎将表的数据存放在内存中。Memory替代以前的Heap成为首选项,但同时向下兼容,Heap仍被支持。

Memory存储引擎特性:

Memory 与 MySQL Cluster的比较

希望部署内存引擎的开发者们会考虑MySQL Cluster是否是更好的选择,参考如下Memory引擎的使用场景及特点:

能像会话(Session)或缓存(Caching)一样方便操作和管理。

充分发挥内存引擎的特点:高速度,低延迟。

只读或读为主的访问模式(不适合频繁写)。

但是内存表的性能受制于单线程的执行效率和写操作时的表锁开销,这就限制了内存表高负载时的扩展性,特别是混合写操作的并发处理。此外,内存表中的数据在服务器重启后会丢失。

MySQL Cluster(集群)支持与Memory引擎同样的功能并且提供更高的性能,同时拥有Memory不支持的更多其它功能:

行锁机制更好的支持多线程多用户并发。

更好的支持读写混合语句以及扩展。

可选择磁盘存储介质永久保存数据。

Shared-nothing和分布式架构保证无单点故障,99.999% 可用性。

数据自动分布在各个节点,应用开发者无需考虑分区或分片解决方案。

支持MEMORY中不支持的变长数据类型(包括BLOB 和 TEXT)。

关于MySQL集群与Memory引擎更多细节方面的比较,可以查看Scaling Web Services with MySQL Cluster: An Alternative to the MySQL Memory Storage Engine,该白皮书包括了这两种技术的性能研究,并一步步指导你如何将Memory用户迁移到MySQL集群。

每个Memory表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。要明确指出你想要一个Memory表,可使用ENGINE选项来指定:

#div_code img{border:0px;}CREATETABLEt (iINT) ENGINE=MEMORY;

如它们名字所指明的,Memory表被存储在内存中,且默认使用哈希索引。这使得它们非常快,并且对创建临时表非常有用。可是,当服务器关闭之时,所有存储在Memory表里的数据被丢失。因为表的定义被存在磁盘上的.frm文件中,所以表自身继续存在,在服务器重启动时它们是空的。

这个例子显示你如何可以创建,使用并删除一个Memory表:

#div_code img{border:0px;}CREATETABLEtest ENGINE=MEMORY;SELECTip,SUM(downloads)ASdownFROMlog_tableGROUPBYip;SELECTCOUNT(ip),AVG(down)FROMtest;DROPTABLEtest;

MEMORY表有下列特征:

给Memory表的空间被以小块来分配。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在你往表里插入新数据之时被重新使用。Memory表也没有通常与在哈希表中删除加插入相关的问题。

MEMORY表可以有多达每个表64个索引,每个索引16列,以及3072字节的最大键长度。

MEMORY存储引擎支持HASH和BTREE索引。你可以通过添加一个如下所示的USING子句为给定的索引指定一个或另一个:

#div_code img{border:0px;}CREATETABLElookup(idINT,INDEXUSING HASH (id))ENGINE=MEMORY;CREATETABLElookup(idINT,INDEXUSING BTREE (id))ENGINE=MEMORY;

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

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

对可包含NULL值的列的索引

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

MEMORY不能包含BLOB或TEXT列.MEMORY支持AUTO_INCREMENT列

MEMORY表支持INSERT DELAYED非临时的

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

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

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

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表中,一行需要的内存使用下列公式计算:

#div_code img{border:0px;}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*))

mysql表jiayi_MySQL Memory存储引擎:优势及性能测试相关推荐

  1. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  2. mysql数据库中的存储引擎

    mysql数据库中的存储引擎 文章目录 mysql数据库中的存储引擎 mysql中包含的存储引擎 1.InnoDB存储引擎 1.1简介 1.2InnoDB体系架构 1.2.1后台线程 1.2.2内存 ...

  3. Mysql技术内幕——InnoDB存储引擎

    一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...

  4. Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型

    1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...

  5. Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎

    特此申明: 前段时间找工作所以看了<Mysql技术内幕InnoDB存储引擎>,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处.不过无所谓啦,写出来自己看看,需要的 ...

  6. MySql基础知识、存储引擎与常用数据类型

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据 ...

  7. mysql memory优点_MySQL Memory存储引擎:优势及性能测试

    [IT168技术]需求源自项目中的MemCache需求,开始想用MemCached(官方站点:http://memcached.org/ ),但这个在Linux下面应用广泛的开源软件无官方支持的Win ...

  8. MySQL Memory 存储引擎浅析

    MySQL Memory 存储引擎浅析 吴剑 2011-11-29 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 吴剑 http://www.cnblog ...

  9. Day902.Memory存储引擎 -MySQL实战

    Memory存储引擎 Hi,我是阿昌,今天学习记录的是关于Memory存储引擎的内容. 两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值 ...

最新文章

  1. 登录linux后台工具,linux后台进程管理工具-supervisor
  2. react项目开发步骤_成为专业React开发人员的31个步骤
  3. html5 canvas图片渐变
  4. DocumentFragment使用
  5. Java集合框架-概述
  6. 发布一款给图片批量加水印的程序PicNet V1.0
  7. python学习笔记爬虫——爬取网络表情包
  8. cfa英语不好的怎么学_英语基础很差,如何备考CFA?
  9. IDEA统计自己写了多少行Java代码,看看自己的辛劳成果吧
  10. 台式机装苹果系统_AMD台式机装苹果系统!!
  11. PTA乙级1014(python3)
  12. 二阶求导 算法 实现 寻峰问题(转)
  13. Elasticsearch教程 | 第三篇:审计设置
  14. python ljust()、center() 、rjust() 字符串填充左中右对齐
  15. mysql 复制数据库
  16. 《创业时代》这部剧或许大家都有看过,里面的郭鑫年(黄轩饰),最终创业成功了吗?
  17. 6款程序员常用代码对比工具,你用过几款?
  18. [2017.02.06] 阅读《Effective Morden C++》
  19. 如何编写 INF 文件
  20. 视频无损放大软件Topaz Video Enhance AI for Mac更新啦

热门文章

  1. android interview 2
  2. linux中menu命令,menucofig 详解
  3. 自由自在意式手工冰淇淋的清凉之风已“冰”临城下
  4. 【转】ABAP内表数据和JSON格式互转
  5. ABAP数据库操作之操作语句Insert
  6. SAP 采购订单上的总账科目如何自动带出来
  7. SAP的资产负债表、损益表的利润体现
  8. SAP 系统参数设置 RZ10 RZ11
  9. 解决oracle连接很慢问题
  10. SAP CO Report