一、MyISAM存储引擎
MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件。首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm 文件,另外还有.MYD和.MYI 文件,分别存放了表的数据(.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,掌握好这两种引擎,就可以对基于MySQL的数据存储服务得心应手了。