目录
文件系统存储特点
Memory存储引擎的功能特点
MySQL环境演示Memory存储引擎的使用
容易混淆的概念
使用场景
文件系统存储特点
- 也称HEAP存储引擎,所以数据保存在内存中
问:Mysql服务器重之后,Memory存储引擎的保存数据为什么都会消失,但是表情结构却会保留下来?
答:因为Memory存储引擎表结构是保存在磁盘文件中的,而数据是保存在内存中的,由于Memory存储引擎的存储特点,Memory存储引擎的I/O效率要MyISAM高很多,因为MyISAM只有索引会保存在内存中,而数据则是由操作系统来换缓存的,而Memory存储引擎的数据和索引的,全都是在内存中的。
Memory存储引擎的功能特点
- 1 支持Hash索引和BTree索引
如果在建立索引时没有指定所有类型的话,默认会建立的是哈希索引。由于哈希索引的特点,如果是在做等值查询的话,会非常的快;如果使用范围查询的话呢,就无法使用哈希索引了。
所以,如果要使用Memory存储引擎的话,我们在建立索引的时候,一定要先了解我们的业务是如何使用存储引擎的表的,如果绝大部分都是要进行等值查找的话,那我们就可以使用哈希使用索引,范围则是BTree索引。
注意:
使用错误的索引类型,是在Memory存储引擎最常见的一种错误之一了,不正确的索引会对性能造成很大的影响,大家一定要注意。
- 2 所有字段为固定长度 varchar(10)=char(10)
就算是我们在定义表时使用了varchar(10),在存储时同样会转换成char(10)固定长度字段的类型来进行存储,这就要求我们在定义表结构时的,一定要尽力使用符合要求的最小的用字的长度,否则那就会浪费了大量的内存。
- 3 不支持BLOG和TEXT等大字段
问:Memory存储引擎在定义表结构式的限制是什么?
答:不能使用BLOG和TEXT的这大字段类型,同样由于大字段类型的会浪费很大的内存空间,所以Memory存储引擎中是不能使用这种类型的。
- 4 Memory存储引擎使用表级锁
尽管其所有数据和索引全部在内存中,但是得在一个繁忙的系统中,其性能也不见得会比InnoDB搜索引擎要好:
- 一方面,由于InnoDB存储引擎也会把所有需要的数据和索引缓存到内存中,如果我们访问的是热数据的话,也是直接从内存中进行读取的;
- 另一方面就是因为InnoDB存储引擎所使用的是行级锁, Memory存储引擎所使用的是表级锁,行能比表级锁能够支持更大的并发,所以吞吐量的也会越高
- 5 最大大小由max_heap_table_size参数决定
默认值为:16兆【如果我们要在Memory存储引擎中进行,存储大量数据的就要修改这个参数,而且这个参数的修改是对已经存在的Memory存储引擎表无效,所以如果修改参数后,想对已经存在的Memory存储引擎表生效,就要对已经存在的Memory存储引擎的表重建】
MySQL环境演示Memory存储引擎的使用
- 1 建立Memory存储引擎的表
mysql> 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
问:如果字段属性为大字段类型,是否能够将表建立起来?
答:出现了个错误提示,显然是不支持的。
- 2 正确的建表语句
mysql> create table mymemory (id int,c1 varchar(10),c2 char(10)) engine = memory;
Query OK, 0 rows affected (0.02 sec)
- 3 去文件系统刚下看表文件的存储方式
[root@localhost test]# ls -lh mymemory.*
-rw-rw----. 1 mysql mysql 8.5K 2月 20 14:16 mymemory.frm
- 4 创建Memory表索引
# 创建默认索引
mysql> create index idx_c1 on mymemory(c1);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 创建btree索引
mysql> create index idx_c2 using btree on mymemory(c2);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 5 查看Memory表索引特点
mysql> 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)
- 6 查看表的状态信息
mysql> show table status like 'mymemory'\G
*************************** 1. row ***************************
Name: mymemory
Engine: MEMORY
Version: 10
Row_format: Fixed
Rows: 0
Avg_row_length: 26
Data_length: 0
Max_data_length: 4793490
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2019-02-20 14:19:11
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)
# 行类型为固定长度
容易混淆的概念
问:Memory存储引擎表和临时表的区别?
答:临时分成2中,一为系统使用临时表,create temporary table 建立的临时表。无论哪种表,只有当前session是可见的。而Memory表是所有线程都可以使用的。
系统使用临时表又分为两类:查过限制使用Myisam临时表,未超过限制使用Memory表。