文章参考:《MySQL快速入门》潘凯华,李慧,刘欣等编著.—背景:清华大学出版社,2012.1

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以成为表类型)(及存储和操作此表的类型)。

Oracle和Sql Server等数据库只有一种存储引擎,也就是InnoDB。

 

下面介绍Mysql常见存储引擎:

1、InnoDB存储引擎(MySQL默认存储引擎)

特点:

· 提供的功能:事务、回滚、奔溃修复能力和多版本并发控制的事务安全。

· 是Mysql是第一个提供外键约束的表引擎。

· 支持自动增长列AUTO_INCREMENT(Mysql中规定自动增长列的必须为主键)。

优缺点:

· 优势在于提供了良好的事务管理、奔溃修复能力和并发控制。

· 缺点是读写效率稍差,占用的数据空间相对比较大。

适用场合:

· 更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。

· 事务:InnoDB存储引擎是唯一支持事务的标准MySQL存储引擎,这是管理敏感数据(如金融信息和用户注册信息)的必须软件

· 自动灾难恢复:与其他存储引擎不一样,InnoDB表能够自动从灾难中恢复。虽然MyISAM表也能在灾难后修复,但其过程要长的多

附:

· InnoDB可提供高效的ACID特性,具体的ACID特性可参考其他相关文章。

 

2、MyISAM存储引擎

前身:

· MyISAM存储引擎是基于ISAM存储引擎发展起来的。

文件类型(MyISAM储存引擎的表存储成3个文件,文件名与表名相同,扩展名包括frm、myd、myi):
· frm:存储表的结构;

· myd:存储数据,是MYData的缩写;

· myi:存储索引,是MYIndex的缩写;

存储格式:
· MyISAM静态:如果所有表列的大小都是静态的(即不使用xBLOB、xTEXT或者VARCHAR数据类型),MySQL就会自动使用静态MyISAM格式,使用这种类型的表的性能非常高,因为在访问和维护以预定义格式存储的数据时需要很低的开销,但是却要以控件为代价。

· MyISAM动态:如果有表列(及时只有一列)定义为动态的(使用xBLOB、xTEXT、VARCHAR),MySQL就会自动使用动态格式。虽然MyISAM动态表占用的空间比静态格式所占空间少,但空间的节省带来了性能的下降。如果某个字段的内容发生改变,其位置很可能就需要移动,这会导致碎片的产生。随着数据集中的碎片增加,数据访问性能就会相应降低。这个问题有两种修复方法:

a. 尽可能使用静态数据类型。

b. 经常使用OPTIMIZE TABLE语句,他会整理表的碎片,恢复由于表更新和删除而导致的空间丢失。

· MyISAM压缩:有时会创建在整个应用程序生命周期中都只读的表。如果是这种情况,就可以使用myisampack工具将其转换为MyISAM压缩表来减少空间。在给定硬件配置情况下,性能的提升将相当显著。

优缺点:

· MyISAM存储引擎的优势在于占用空间小,处理速度快,缺点是不支持事务和并发性。

 

3、MEMORY存储引擎

前言:

MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。

MEMORY存储引擎的文件存储形式:

· 每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm。该文件只存储表的结构。而其数据文件都是存储在内存中。这样有利于对数据的快速处理,提高整个表的处理效率。

MEMORY存储引擎的索引类型:

· MEMORY存储引擎默认使用哈希(HASH)索引。其速度要比使用BTREE索引快。

MEMORY存储引擎的存储周期:

· MEMORY存储引擎通常很少用到。因为MEMORY表的所有数据都是存储在内存上的,如果内存出现异常就会影响到数据的完整性。如果重启机器或者关机,表中的所有数据都会消失。因此MEMORY存储引擎的表生命周期很短,一般都是一次性的。

MEMORY存储引擎的优缺点:

· MEMORY表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rows和max_heap_table_size。其中,max_rows可以在创建表时指定:max_heap_table_size的大小默认为16MB,可以按需要进行扩大。因其存在内存中的特性,这类表的处理速度非常快。但是其数据容易丢失,生命周期短。(注意:mysqld守护进程奔溃时,所有的MEMORY数据都会丢失)

· MEMORY表不支持VARCHAR、BLOB、TEXT数据类型,因为这种表类型按固定长度的记录格式存储。此外,如果使用版本4.1.0之前的MySQL,这不支持自动增长列。

适用场景:

· 暂时:目标数据只是临时需要,在其生命周期中必须立即可用。

· 相对无关:存储在MEMORY表中的数据如果突然丢失,不会对应用服务产生实质的负面影响,而且不会对数据完整性有长期影响。