每天一个Linux碎片:MySQL存储引擎

羌俊恩 社区创始人
运维领域优质创作者
博客专家认证
2022-08-12 22:17:09

一、MyISAM存储引擎

在数据库中使用MyISAM 存储引擎的表,每一个表都被存放为三个以表名命名的物理文件。包括:存放表结构定义信息的.frm 文件,存储数据的.MYD和存储索引的.MYI 文件。每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。

MyISAM支持三种类型的索引:B-Tree索引、R-Tree索引和Full-text索引。MyISAM最常使用的是B-Tree索引,偶尔会使用到 Full-text,但是 R-Tree 索引一般系统中都是很少用到的。另外 MyISAM 的 B-Tree 索引有一个较大的限制,那就是参与一个索引的所有字段的长度之和不能超过 1000 字节。

使用MyISAM存储引擎遇到以下情况会出现表文件损坏

1、当 mysqld 正在做写操作的时候被 kill 掉或者其他情况造成异常终止;2、主机 Crash;3、磁盘硬件故障;4、MyISAM 存储引擎中的 bug。MyISAM 存储引擎的某个表文件出错之后,仅影响到该表,而不会影响到其他表,更不会影响到其他的数据库。

二、Innodb 存储引擎

Innodb 存储引擎是第三方公司开发的存储引擎,物理结构分为数据文件(表数据和索引数据)和日志文件两大部分,在功能方面有以下特点:

1、支持事务安全;Innodb在功能方面最重要的一点就是对事务安全的支持,这也是让Innodb成为MySQL最为流行的存储引擎之一的一个非常重要原因。

2、数据多版本读取;Innodb 在事务支持的同时,在并发的情况下为了保证数据的一致性,通过对undo信息,实现了数据的多版本读取。

3、锁定机制的改进;Innodb 改变了 MyISAM 的锁机制,实现了行锁,行锁机制的实现是通过索引来完成的,在数据库中 99%的 SQL 语句都是要使用索引来做检索数据的。

4、实现外键;Innodb 实现了外键引用这一数据库的重要特性,使在数据库端控制部分数据的完整性成为可能。

由于 Innodb 是事务安全的存储引擎,所以系统 Crash 对他来说并不能造成非常严重的损失,由于有 redo 日志的存在,有 checkpoint 机制的保护,Innodb 完全可以通过 redo 日志将数据库 Crash 时刻已经完成但还没有来得及将数据写入磁盘的事务恢复,也能够将所有部分完成并已经写入磁盘的未完成事务回滚并将数据还原。

三、NDB Cluster 存储引擎

NDB 存储引擎主要用于 MySQL Cluster 分布式集群环境,Cluster 是 MySQL 从 5.0 版本才开始提供的新功能。离开了 MySQL CLuster 整个环境,NDB 存储引擎也将失去太多意义。简单的说,Mysql Cluster 实际上就是在无共享存储设备的情况下实现的一种内存数据库 Cluster 环境,其主要是通过 NDB Cluster(简称 NDB)存储引擎来实现的。一个 Mysql Cluster 的环境主要由以下三部分组成:

1、负责管理各个节点的 Manage 主机;管理节点负责整个 Cluster 集群中各个节点的管理工作,包括集群的配置,启动关闭各节点,以及实施数据的备份恢复等。

2、SQL 层的 SQL 服务器节点(后面简称为 SQL 节点),也就是我们常说的 Mysql Server;主要负责实现一个数据库在存储层之上的所有事情,比如连接管理,query 优化和响应,cache 管理等等。

3、Storage 层的 NDB 数据节点,也就是 NDB Cluster;NDB 是一个内存式存储引擎也就是说,他会将所有的数据和索引数据都 load 到内存中 ,但也会将数据持久化到存储设备上,NDB 节点主要是实现底层数据存储的功能,保存 Cluster 的数据。

四、Merge 存储引擎

Merge 存储引擎可以简单的理解为其功能就是实现了对结构相同的 MyISAM 表 ,通过一些特殊的包装对外提供一个单一的访问入口,以达到减小应用的复杂度的目的。要创建MERGE 表,不仅仅基表的结构要完全一致,包括字段的顺序,基表的索引也必须完全一致。MERGE 表本身并不存储数据,仅仅只是为多个基表提供一个统一的存储入口。所以在创建 MERGE 表的时候,MySQL 只会生成两个较小的文件,一个是.frm 的结构定义文件,还有一个.MRG 文件,用于存放参与 MERGE 的表的名称(包括所属数据库 schema)。

五、Memory 存储引擎

Memory 存储引擎是一个将数据存储在内存中的存储引擎。Memory 存储引擎不会将任何数据存放到磁盘上,仅仅存放了一个表结构相关信息的.frm 文件在磁盘上面。所以一旦 MySQL Crash 或者主机 Crash 之后,Memory 的表就只剩下一个结构了。Memory 表支持索引,并且同时支持 Hash 和 B-Tree 两种格式的索引。由于是存放在内存中,所以 Memory 都是按照定长的空间来存储数据的,而且不支持 BLOB 和 TEXT类型的字段。

关于存储引擎,还有BDB 存储引擎、FEDERATED 存储引擎、ARCHIVE 存储引擎、BLACKHOLE 存储引擎和CSV 存储引擎,不同的存储引擎有不同的特点,可以应对不同的应用场景,MySQL最常用的两个存储引擎就是MyISAM和InnoDB,我们掌握好这两种引擎就可应对大部分场景了。

...全文
16 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
云享运维知识库

9316

社区成员

欢迎各位小伙伴踊跃加入,将日常运维中遇到的问题贴出来,解决方案分享出来,或自己的博客关于运维的文章分享到这里,来一起营造一个运维的知识库,以提升运维工作更加高效快捷,减少重复造车轮的无限循环。
devopslinux开源 企业社区 北京·西城区
社区管理员
  • 羌俊恩
加入社区
帖子事件
创建了帖子
2022-08-12 22:17
社区公告

本社区:旨在推进运维云化知识库建设,为更多运维提供参考及经验交流;加入社区的同学,如果运维工作中遇到问题或最后得到解决,有劳凑空发帖,分享共建FAQ社区。

得到解决方案的同学,请积极为发帖的同学点赞、评论、能力范围内打赏激励。另外本社区采用游戏修仙角色作为鼓励,对不同贡献者授予对应“勋章”。

最后祝愿社区繁荣昌盛,此致敬礼!!!