10 Myisam、InnoDB

本文探讨了MySQL的InnoDB和Memory两种引擎的区别。InnoDB采用索引组织表,支持行锁和变长数据类型,而Memory引擎使用堆组织表,支持内存存储和快速查询,但仅支持表锁。Memory引擎适合数据量小、临时表的场景,因为它不持久化数据,重启后数据丢失。InnoDB则适合需要数据持久化的场景。
摘要由CSDN通过智能技术生成

《MySQL实战45讲》

表结构和表数据文件:https://www.cnblogs.com/meitian/p/9886654.html、https://blog.csdn.net/lhanson/article/details/82803947

InnoDB架构:https://blog.csdn.net/qqqq0199181/article/details/80659856

Myisam和InnoDB:https://cloud.tencent.com/developer/article/1418038

1 什么时候使用Memory引擎

InnoDB和Memory引擎的数据组织方式是不同的:

InnoDB引擎把数据放在主键索引上,其他索引上保存的是主键id,称之为索引组织表(Index OrganiziedTable)。

Memory引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,称之为堆组织表(Heap OrganiziedTable);
比如有id主键和一个字段,依次写入1,2,3,4,5,6,7,8,9,0主键和对应的值

在这里插入图片描述

可以看出这两个引擎的⼀些典型不同:

  1. InnoDB表的数据是有序存放的;
    内存表的数据是按照写入顺序存放的;
  2. 当数据文件有空洞的时候,InnoDB表在插⼊新数据的时候,为了保证数据有序性,只能在固定的位置写⼊新值;
    内存表找到空位就可以插入新值;
  3. 数据位置发生变化的时候,InnoDB表只需要修改主键索引;
    内存表需要修改所有索引;
  4. InnoDB表用主键索引查询时需要走⼀次索引查找,用普通索引查询的时候,需要走两次索引查找;
    内存表没有这个区别,所有索引的“地位”都是相同的。
  5. InnoDB⽀持变长数据类型,不同记录的长度可能不同;
    内存表不⽀持Blob 和 Text字段,并且即使定义了varchar(N),实际也当作char(N),也就是固定长度字符串来存储,因此内存表的每行数据长度相同。

Memory支持哈希索引和B-Tree索引,可以同时使用:
在这里插入图片描述
内存表的优势是速度快,原因:
Memory引擎支持hash索引;
内存表的所有数据都保存在内存,读写速度比磁盘表快。

不建议在生产环境上使用内存表:

  • 1.锁粒度问题

内存表不支持行锁,只支持表锁。

  • 2.数据持久化问题

数据放在内存中,是内存表的优势,但也是⼀个劣势,因为数据库重启的时候,所有的内存表都会被清空。

如图双M架构:
在这里插入图片描述
假如slave重启,由于MySQL知道重启之后,内存表的数据会丢失,所以,担心备库重启之后,出现主备不⼀致,MySQL在实现上做了这样⼀件事:在数据库重启之后,往binlog里面写⼊⼀行DELETE FROM 表名
在备库重启的时候,备库binlog里的delete语句就会传到主库,然后把主库内存表的内容删除,这样在使用的时候就会发现,主库的内存表数据突然被清空了。

使用Memor的场景:在数据量可控,不会耗费过多内存的情况下,可以考虑使用内存表,如将InnoDB临时表改为使用内存表

内存临时表刚好可以无视内存表的两个不足,原因:

  1. 临时表不会被其他线程访问,没有并发性的性能问题;
  2. 临时表重启后也是需要删除的,清空数据这个问题不存在;
  3. 备库的临时表也不会影响主库的用户线程。

而相比临时表的好处则为:

  1. 相比于InnoDB表,使用内存表不需要写磁盘,往临时表的写数据的速度更快;
  2. 索引使用hash索引,查找的速度比B+Tree索引快,且如果需要按范围查找,则可以加上B-Tree索引
  3. 临时表数据不多,占用的内存有限。

2 MySQL的内容

可结合序号为1的文章阅读

2.1 物理结构

通过文件系统对数据和索引进行存储

从物理结构上可以分为日志文件和数据索引文件。

在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下。

日志文件采用顺序IO方式存储、数据文件采用随机IO方式存储。

2.2 日志

错误日志(errorlog)

二进制日志(bin log)

通用查询日志(general query log)

慢查询日志(slow query log)

重做日志(redo log)

回滚日志(undo log)

中继日志(relay log)

2.3 文件

一个database对应一个目录

  • InnoDB数据文件

.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息

.ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。

.ibdata文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文
件。

  • MyIsam数据文件

.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息

.myd文件:主要用来存储表数据信息。

.myi文件:主要用来存储表数据文件中任何索引的数据树。

InnoDB数据和索引在同一个文件,MyIsam则分开存储

也因此MyIsam为非聚集索引,InnoDB为聚集索引

2.4 区别

https://cloud.tencent.com/developer/article/1418038:
在这里插入图片描述

3 InnoDB架构

由内存池、后台线程、磁盘文件三大部分组成

Dubbo write:刷新脏页到磁盘时,写两份,避免数据丢失,达到数据页的高可靠性

https://blog.csdn.net/qqqq0199181/article/details/80659856

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值