关于MySQL Memory存储引擎的相关知识

 更新时间:2020年11月09日 14:23:22   作者:AsiaYe  
这篇文章主要介绍了关于MySQL Memory存储引擎的相关知识,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下

关于Memory存储引擎的知识点

    Memory存储引擎在日常的工作中使用的是比较少的,但是在MySQL的某些语法中,会用到memory引擎的内存表,它有以下几个特点:

1、内存表的建表语法是create table … engine=memory。

2、这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。

2、Memory存储引擎的数据和索引是分开的。memory存储引擎的表也可以有主键,主键id上存储的是每个数据的位置,主键id是哈希索引,索引上的key也不是连续的。

    这种数据和索引分开存放的数据组织形式,我们称之为"堆组织表",这点区别于Innodb 存储引擎的"索引组织表"

Innodb和memory存储引擎的区别

1、Memory存储引擎的数据存储顺序和插入顺序相同,而innodb存储引擎的数据存储顺序是按照聚集索引有序排列的。举例如下:

mysql> create table t1(id int primary key, c int) engine=Memory;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0

mysql> select * from t1;
+----+------+
| id | c  |
+----+------+
| 1 |  1 |
| 2 |  2 |
| 3 |  3 |
| 4 |  4 |
| 5 |  5 |
| 6 |  6 |
| 7 |  7 |
| 8 |  8 |
| 9 |  9 |
| 0 |  0 |
+----+------+
10 rows in set (0.00 sec)


mysql> create table t2(id int primary key, c int) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t2 values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(0,0);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0


mysql> select *from t2;
+----+------+
| id | c  |
+----+------+
| 0 |  0 |
| 1 |  1 |
| 2 |  2 |
| 3 |  3 |
| 4 |  4 |
| 5 |  5 |
| 6 |  6 |
| 7 |  7 |
| 8 |  8 |
| 9 |  9 |
+----+------+
10 rows in set (0.00 sec)

可以看到,memory存储引擎的结果中,(0,0)这条记录是在最后面的,和插入顺序一致,而innodb存储引擎的结果中,是按照记录的顺序进行排列的。

2、当数据文件有空洞的时候,innodb存储引擎插入数据需要在指定的位置插入,而memory存储引擎只要找到空隙就可以插入

3、当数据位置发生变化的时候,memory存储引擎需要修改所有的索引,而innodb存储引擎仅需要修改主键索引即可。

4、innodb存储引擎查询的时候有"回表",而memory存储引擎不需要回表。

5、innodb存储引擎支持varchar,而memory存储引擎不支持,所有的varchar都当做char处理,除此之外,memory存储引擎还不支持blob和text字段。

6、范围查询的时候,memory存储引擎无法支持。因为它的索引类型是哈希索引

在生产环境上,一般不建议使用内存表,理由主要有以下两点:

1、内存表不支持行锁,只支持表锁,一旦该表有更新,就会阻塞该表的其他操作,包括读操作;这就意味着这种表的并发性能不好。

2、数据持久性不好,一旦数据库宕机,内存表中的数据会丢失,他会忘往binlog中写入一条delete from table的语句,但是表结构还是存在的。这个delete语句在双M的环境下,从库宕机有可能污染主库的临时表数据,是比较危险的操作。

以上就是关于MySQL Memory存储引擎的相关知识的详细内容,更多关于MySQL Memory存储引擎的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL InnoDB Cluster搭建安装教程

    MySQL InnoDB Cluster搭建安装教程

    这篇文章主要介绍了MySQL InnoDB Cluster搭建安装教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • JDBC连接的六步实例代码(与mysql连接)

    JDBC连接的六步实例代码(与mysql连接)

    这篇文章主要给大家介绍了关于JDBC连接的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 详解Centos7 修改mysql指定用户的密码

    详解Centos7 修改mysql指定用户的密码

    本篇文章主要介绍了Centos7 修改mysql指定用户的密码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • 浅析MySQL数据的导出与导入知识点

    浅析MySQL数据的导出与导入知识点

    在本文里我们给大家分享了关于MySQL数据的导出与导入的相关实例和知识点内容,需要的朋友们跟着学习下。
    2019-03-03
  • 解决mysql报错:Data source rejected establishment of connection, message from server: \"Too many connectio

    解决mysql报错:Data source rejected establishment of connect

    这篇文章主要给大家介绍了关于如何解决mysql报错:Data source rejected establishment of connection, message from server: \"Too many connectio的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • MySQL 数据库双向镜像、循环镜像(复制)

    MySQL 数据库双向镜像、循环镜像(复制)

    在MySQL数据库镜像的贴子中,主数据库A 的数据镜像到从数据库B,是单向的,Zen Cart网店的数据读写都必须在数据库A进行,结果会自动镜像到数据库B中。但是对数据库B的直接操作,不会影响数据库A。
    2011-05-05
  • 浅谈mysqldump使用方法(MySQL数据库的备份与恢复)

    浅谈mysqldump使用方法(MySQL数据库的备份与恢复)

    下面小编就为大家带来一篇浅谈mysqldump使用方法(MySQL数据库的备份与恢复)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 讲解Linux系统下如何自动备份MySQL数据的基本教程

    讲解Linux系统下如何自动备份MySQL数据的基本教程

    这篇文章主要介绍了Linux系统下如何自动备份MySQL数据的基本教程,还给出了利用shell脚本全备份和增量备份的基本方法,需要的朋友可以参考下
    2015-11-11
  • 分析MySQL中索引引引发的CPU负载飙升的问题

    分析MySQL中索引引引发的CPU负载飙升的问题

    这篇文章主要介绍了分析MySQL中索引引引发的CPU负载飙升的问题,文中提到了独立索引所带来的巨大CPU负担,以提醒在MySQL中使用索引要注意CPU负载的问题,需要的朋友可以参考下
    2015-05-05
  • 解决Mysql的left join无效及使用的注意事项说明

    解决Mysql的left join无效及使用的注意事项说明

    这篇文章主要介绍了解决Mysql的left join无效及使用的注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论