MySQL 学习篇(二)MySQL常用存储引擎——Memory

目录​​​​​​​

文件系统存储特点

Memory存储引擎的功能特点

MySQL环境演示Memory存储引擎的使用

容易混淆的概念

使用场景


  • 文件系统存储特点

  1. 也称HEAP存储引擎,所以数据保存在内存中

问:Mysql服务器重之后,Memory存储引擎的保存数据为什么都会消失,但是表情结构却会保留下来?

答:因为Memory存储引擎表结构是保存在磁盘文件中的,而数据是保存在内存中的,由于Memory存储引擎的存储特点,Memory存储引擎的I/O效率要MyISAM高很多,因为MyISAM只有索引会保存在内存中,而数据则是由操作系统来换缓存的,而Memory存储引擎的数据和索引的,全都是在内存中的。

  • Memory存储引擎的功能特点

  1. 1 支持Hash索引和BTree索引

如果在建立索引时没有指定所有类型的话,默认会建立的是哈希索引。由于哈希索引的特点,如果是在做等值查询的话,会非常的快;如果使用范围查询的话呢,就无法使用哈希索引了。

所以,如果要使用Memory存储引擎的话,我们在建立索引的时候,一定要先了解我们的业务是如何使用存储引擎的表的,如果绝大部分都是要进行等值查找的话,那我们就可以使用哈希使用索引,范围则是BTree索引。

注意:

使用错误的索引类型,是在Memory存储引擎最常见的一种错误之一了,不正确的索引会对性能造成很大的影响,大家一定要注意。

  1. 2 所有字段为固定长度 varchar(10)=char(10)

就算是我们在定义表时使用了varchar(10),在存储时同样会转换成char(10)固定长度字段的类型来进行存储,这就要求我们在定义表结构时的,一定要尽力使用符合要求的最小的用字的长度,否则那就会浪费了大量的内存。

  1. 3 不支持BLOG和TEXT等大字段

问:Memory存储引擎在定义表结构式的限制是什么?

答:不能使用BLOG和TEXT的这大字段类型,同样由于大字段类型的会浪费很大的内存空间,所以Memory存储引擎中是不能使用这种类型的。

  1. 4 Memory存储引擎使用表级锁

尽管其所有数据和索引全部在内存中,但是得在一个繁忙的系统中,其性能也不见得会比InnoDB搜索引擎要好:

  • 一方面,由于InnoDB存储引擎也会把所有需要的数据和索引缓存到内存中,如果我们访问的是热数据的话,也是直接从内存中进行读取的;
  • 另一方面就是因为InnoDB存储引擎所使用的是行级锁, Memory存储引擎所使用的是表级锁,行能比表级锁能够支持更大的并发,所以吞吐量的也会越高
  1. 5 最大大小由max_heap_table_size参数决定

默认值为:16兆【如果我们要在Memory存储引擎中进行,存储大量数据的就要修改这个参数,而且这个参数的修改是对已经存在的Memory存储引擎表无效,所以如果修改参数后,想对已经存在的Memory存储引擎表生效,就要对已经存在的Memory存储引擎的表重建

  • MySQL环境演示Memory存储引擎的使用

  1. 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

问:如果字段属性为大字段类型,是否能够将表建立起来?

答:出现了个错误提示,显然是不支持的。

  1. 2 正确的建表语句
mysql>  create table mymemory (id int,c1 varchar(10),c2 char(10)) engine = memory;
Query OK, 0 rows affected (0.02 sec)
  1. 3 去文件系统刚下看表文件的存储方式
[root@localhost test]# ls -lh mymemory.*
-rw-rw----. 1 mysql mysql 8.5K 2月  20 14:16 mymemory.frm
  1. 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

 

  1. 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)
  1. 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表。

  • 使用场景

猜你喜欢

转载自blog.csdn.net/Sicily_winner/article/details/87746334
今日推荐