首页 > 数据库 > MySQL > MySQL MEMORY存储引擎
MEMORY存储引擎特性
| Storage limits | RAM | Transactions | No | Locking granularity | Table |
|---|---|---|---|---|---|
| MVCC | No | Geospatial data type support | No | Geospatial indexing support | No |
| B-tree indexes | Yes | T-tree indexes | No | Hash indexes | Yes |
| Full-text search indexes | No | Clustered indexes | No | Data caches | N/A |
| Index caches | N/A | Compressed data | No | Encrypted data | Yes |
| Cluster database support | No | Replication support | Yes | Foreign key support | No |
| Backup / point-in-time recovery | Yes | Query cache support | Yes | Update statistics for data dictionary | Yes |
MEMORY存储引擎的使用场景及特点:
MySQL Cluster(集群)支持与MEMORY引擎同样的功能并提供更高的性能,并提供MEMORY不支持的更多其他特性:
内存性能被单一线程执行及表级锁开销所制约,当负载增加特别是包含大量写操作时,这将成为性能的瓶颈。尽管是完全使用内存访问,但是在业务繁忙的系统,他们并不见得比InnoDB表更快。在一般查询系统,或读/写工作负载,表级锁粒度将大大降低并发访问。
创建表时使用ENGINE=MEMORY,MEMORY表大小由max_heap_table_size控制,该值默认为16MB
mysql> CREATE TABLE t (i INT) ENGINE=MEMORY; mysql> CREATE TABLE test_memory ENGINE= MEMORY as select * from test; mysql> DROP TABLE test_memory;
MEMORY表支持HASH与BTREE索引,MEMORY表最大支持64个索引,每个索引16列,最大键长度为3072字节
MEMORY表中如果Hash索引包含大量重复的键(多个索引项包含相同值),更新或删除表中键值会非常缓慢,减慢程度与重复度成正比,可使用BTREE索引避免此问题;
MEMORY表支持非唯一键(一般哈希索引不能实现的特性;
索引列可包含NULL值
mysql> CREATE TABLE lookup
(id INT, INDEX USING HASH (id))
ENGINE = MEMORY;
mysql> CREATE TABLE lookup
(id INT, INDEX USING BTREE (id))
ENGINE = MEMORY;
两者均可将数据放入内存,当临时表数据超过tmp_table_size时,自动转化为磁盘表,性能急剧下降
MEMORY表数据满之后,会提示错误,不会进行转化。
当主库关闭或重启时,主库上的MEMORY表数据清空,会造成主从数据不一致。
为同步主备数据MEMORY表,当主库启动后第一次使用内存表时,会在主库的binlog中写入一条DELETE语句,来删除从库中的数据。当主库重启及第一次使用内存表间,从库的数据依旧不是最新的数据,为避免该情况,主库启动时使用--init-file重置内存表。
可以将INSERT INTO ... SELECT 或 LOAD DATA INFILE等初始化语句放入该文件中作为MEMORY表
持久的数据源。
MEMORY也支持INSERT DELAYED来导入数据供会话并发访问。
服务器需要足够的内存来运行所有正在使用的内存表
当删除部分记录时,内存不会立即被回收;只有全部记录都被删除时,内存才会被回收。之前用于存储删除记录的内存空间会被该表的新增记录使用。
收回内存表使用空间的方式执行DELETE、TRUNCATE或DROP TABLE可完全释放该表占用的内存
使用ALTER TABLE ENGINE=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的值,除非你希望所有session创建的内存表都使用这个值)
mysql> SET max_heap_table_size = 1024*1024; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY; Query OK, 0 rows affected (0.01 sec) mysql> SET max_heap_table_size = 1024*1024*2; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY; Query OK, 0 rows affected (0.00 sec)
当服务重启后,两个表都将使用全局max_heap_table_size
在创建MEMORY表时,也可指定MAX_ROW来限制存储的最大记录,该选项仍然作为限制表最大尺寸的约束,但不会让表增长超过max_heap_table_size的值,需要将MAX_ROW与max_heap_table_size均合理设置。
参见
http://dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html
http://www.nowamagic.net/librarys/veda/detail/1405
svoid
2014-09-16
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29733787/viewspace-1376548/ ,如需转载,请注明出处,否则将追究法律责任。