同事咨询MySQL MEMORY引擎的细节,可否知足需求。没有太多懂得,这里做个体系总结。
- CREATE TABLE t (i INT) ENGINE = MEMORY;
MEMORY存储引擎创建的表数据只能保存在内存。
MySQL宕机、硬件故障或者不测掉落电,都邑造成MEMORY引擎表损掉数据。所以,MEMORY表中的数据来源竽暌冠其他表(可落盘永远保存)用于只读实用,或者用于临时工作起到数据周转。
[a] Implemented in the server (via encryption functions). Data-at-rest tablespace encryption is available in MySQL 5.7 and later.
[b] Implemented in the server, rather than in the storage engine.
[c] Implemented in the server, rather than in the storage engine.
来源: https://dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html
何时应用MEMORY
- 临时应用、不重要的数据,例如网站的会话治理懈弛存。可接法术据损掉。
- 发挥其拜访快、低延迟特点
- 只读或者大年夜部分是读操作,不合适大年夜量写操作。
机能特点
内存表受限于单线程履行和表级锁引起的┞幅用。在负载增长时限制了可扩大性,特别是写操作。
尽管内存表在内存中处理,在劳碌的办事网上,并不必定比InnoDB表更快,如一般萌芽或者读写场景。特别是,多个会话履行update操作会造成机能低下。
内存表的物理特点
每张内存表会在硬盘上创建一个文件,用于保存表构造(没稀有据)。文件名为以内存表名开端,.frm结尾。
特点
- 内存表的空间应用小块(small block)。表应用100%动态hash插入。已删除的行放到余暇列表中,下次插入新数据会被应用。
- 应用定长的行存储格局。变长类型存入内存表需转换为定长。
- 不支撑BLOB、TEXT类型的列。
- 内存表支撑自增列(AUTO_INCREMENT)
- 不克不及在多个会话上共享临时表。
内存表的DDL操作
创建临时表
基于非内存表创建内存表,并将数据拉入到内存表中
- mysql> CREATE TABLE test ENGINE=MEMORY
- -> SELECT ip,SUM(downloads) AS down
- -> FROM log_table GROUP BY ip;
- mysql> SELECT COUNT(ip),AVG(down) FROM test;
- mysql> DROP TABLE test;
内存表的最大年夜受限于 max_heap_table_size 参数,默认为16MB。根据场景需本身调剂该参数。
索引
MEMORY存储引擎支撑HASH和BTREE索引。
- CREATE TABLE lookup
- (id INT, INDEX USING HASH (id))
- ENGINE = MEMORY;
- CREATE TABLE lookup
- (id INT, INDEX USING BTREE (id))
- ENGINE = MEMORY;
每张内存表可创建64个索引,每个索引最大年夜支撑16个列,一个key的长度最大年夜值为3072bytes。
如不雅一个内存表hash索引的键值有很高的反复度,更新键值、删除操作速度都邑明显降低。这种速度降低的程度与键值反复度成正比。您可以应用BTREE索引来规避这个问题。
内存表1行记录占用内存计算公式
内存表可以有非独一键(这是hash索引不常用的功能)。
索引列中可包含NULL值。
加载数据
推荐阅读
11.11的脚步近了,是不是该囤货了,作为一个资深陪读爸妈是不是预备给本身,哦不,给孩子买一台家用功课打印机,毕竟师长教师如今很多多少都是发电子功课了......特别提示:如不雅小同伙的>>>详细阅读 本文标题:MySQL MEMORY引擎及性能比对 地址:http://www.17bianji.com/lsqh/38542.html 1/2 1