文件系统存储特点
称HEAP存储引擎,所以数据保存在内存中(服务器重启则表的数据丢失,但是表结构是保留的,表结构保存在磁盘文件中,而表的内容是存储在内存中)
功能特点
- 支持HASH索引(等值查询)和BTree索引(范围查找)(默认HASH)
- 所有字段都为固定长度varchar(10) = char(10)
- 不支持BLOG和TEXT等大字段
- Memory存储引擎使用表级锁
- 表的最大大小由max_heap_table_size参数决定(默认16M,对存在的表修改是无效的)
实例
首先创建表
MySQL [test]> create table mymemory (id int,c1 varchar(10),c2 char(10),c3 text ) engine = memory;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns
MySQL [test]> create table mymemory (id int,c1 varchar(10),c2 char(10) ) engine = memory;
Query OK, 0 rows affected (0.02 sec)
我们能够看到,表是不支持TEXT字段的
我们再看下文件系统
[root@wangerxiao test]# ls -lh mymemo*
-rw-r----- 1 mysql mysql 8.5K Mar 17 15:25 mymemory.frm
只有一个保存表结构的文件
下面我们再看下表的索引
首先,新建两个索引
MySQL [test]> create index idx_c1 on mymemory(c1);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL [test]> create index idx_c2 using btree on mymemory(c2);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
我们查看当前索引类型
MySQL [test]> show index from mymemory \G
*************************** 1. row ***************************
Table: mymemory
Non_unique: 1
Key_name: idx_c1
Seq_in_index: 1
Column_name: c1
Collation: NULL
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
*************************** 2. row ***************************
Table: mymemory
Non_unique: 1
Key_name: idx_c2
Seq_in_index: 1
Column_name: c2
Collation: A
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
存在两个索引,一个为默认的,一个是指定的BTree。
接下来我们查看表的状态
MySQL [test]> show table status like 'mymemory'\G
*************************** 1. row ***************************
Name: mymemory
Engine: MEMORY
Version: 10
Row_format: Fixed
Rows: 0
Avg_row_length: 86
Data_length: 0
Max_data_length: 7799082
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-03-17 15:30:16
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
Memory存储引擎表和临时表的区别
临时表分两类:系统使用临时表,create temporary table 建立的临时表。无论哪种表,只有当前session是可见的。而Memory表是所有线程都可以使用的。
系统使用临时表又分为两类:查过限制使用Myisam临时表,未超过限制使用Memory表。
使用场景
- 用于查找或者是映射表,例如邮编和地区的对应表
- 用于保存数据分析中产生的中间表
- 用于缓存周期性聚合数据的结果表
注意一点是:Memory数据易丢失,所以要求数据可再生
memory存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB,MyISAM存储引擎不同。
OK,这里我们讲解一些memory存储引擎的文件存储形式,索引类型,存储周期和优缺点。
每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型。该文件只存储表的结构,而其数据文件,都是存储在内存中的,这样有利于对数据的快速的处理,提高整个表的处理效率。
值得注意的是:服务器需要有足够的内存来维持memory存储引擎的表的使用。如果不需要了,可以释放这些内存,甚至可以删除不需要的表。
Memory存储引擎默认使用哈希(HASH)索引,其速度比使用B型树(BTREE)索引快。如果我们需要使用B型树索引,可以在创建索引时选择使用。
这里来整理一个小的技巧:
Memory存储引擎通常很少用到,至少我是没有用到过。因为Memory表的所有数据都是存储在内存上的,如果内存出现异常会影响到数据的完整性。
如果重启机器或者关机,表中的所有数据都将消失,因此,基于Memory存储引擎的表的生命周期都比较短,一般都是一次性的。
Memory表的大小是受到限制的,表的大小主要取决于2个参数,分别是max_rows和max_heap_table_size。其中,max_rows可以在创建表时指定,max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
因此,其基于内存中的特性,这类表的处理速度会非常快,但是,其数据易丢失,生命周期短。基于其这个缺陷,选择Memory存储引擎时需要特别小心。