MySQL存储引擎

存储引擎是基于表的,而不是数据库。

MySQL主要的存储引擎

  • InnoDB存储引擎
  • MyISAM存储引擎
  • NDB存储引擎
  • Memory存储引擎
  • Archive存储引擎
  • Federated存储引擎
  • Maria存储引擎

可以通过 SHOW ENGINES\G 语句查看当前数据库支持的所有存储引擎。

InnoDB存储引擎

InnoDB存储引擎支持事务、行锁、外键,并支持类似于Oracle的非锁定读,

即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎

是默认的存储引擎。其设计目标主要面向在线事务处理(OLTP)的应用。

InnoDB通过多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的

4种隔离级别,默认为REPEATABLE级别。同时使用一种被称为next-key locking

策略来避免幻读(phantom)现象的产生。InnoDB存储引擎还提供插入缓冲(insert buffer)、

二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead

等高性能和高可用的功能。

对于表中数据的存储,InnoDB存储引擎采用聚集(clustered)的方式,因此每张表的

存储都是按主键的顺序进行存放。如果没有显示地在表定义时指定主键,InnoDB存储引擎

会为每一行生成一个6字节的ROWID,并以此作为主键。

MyISAM存储引擎

MyISAM存储引擎不支持事务,表锁设计,支持全文索引,主要面向一些OLAP数据库应用。

MyISAM存储引擎表由MYDMYI组成,MYD用来存放数据文件,MYI用来存放索引文件。

MyISAM存储引擎只缓存(cache)索引文件,而不缓存数据文件。

NDB存储引擎

NDB存储引擎是一个集群存储引擎,结果是share nothing的集群架构,因此能提供更高的

可用性。NDB的特点是全部数据放在内存中(MySQL5.1开始可以将非索引数据放在磁盘上),

因此主键查找速度极快,并且可以通过添加NDB数据存储节点线性提高数据库性能,是高可用、

高性能的集群系统。

NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的。

这意味着复杂的连接操作需要巨大的网络开销,因此查询速度很慢。

Memory存储引擎

Memory存储引擎将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。

非常适合用于存储临时数据的临时表。Memory存储引擎默认使用哈希索引。

Memory存储引擎速度非常快,但在使用上有一些限制。比如只支持表锁,并发性能较差,并且

不支持TEXTBLOB列类型。存储变长字段(varchar)时是按照定长字段(char)的方式进行的,

因此会浪费内存。

MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result)。

如果中间结果集大于Memory存储引擎表的容量设置,或者中间结果含有TEXTBLOB列类型字段,

MySQL会把其转换到MyISAM存储引擎表而存放到磁盘中,MyISAM不缓存数据文件,因此这时

产生的临时表的性能对于查询会有损失。

Maria存储引擎

Maria存储引擎是新开发的引擎,目标是取代原有的MyISAM存储引擎,可以看做是MyISAM的后续版本。

特点是:支持缓存数据和索引文件,行锁设计,提供MVCC功能,支持事务和非事务安全的选项,以及更好的

BLOB字符类型的处理性能。