由于MySQL数据库的开源性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎。
一、常见存储引擎
1)InnoDB存储引擎
InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。
InnoDB存储引擎将数据放在一个逻辑的表空间中,从MySQL4.1版本开始,它可以将每个InnoDB存储引擎的表单独放倒一个独立的ibd文件中。此外,InnoDB存储引擎支持使用裸设备(row disk)用来建立其表空间。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-keylocking的策略来避免幻读(phantom)现象的产生。此外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等功能。
对于表中的数据,InnoDB存储引擎采用了聚集(clustered)的方式,每张表中的数据都是按主键顺序存放的。如果没有显示的定义主键,InnoDB存储引擎会为每一行生成一个6个字节的ROWID,并以此为主键。
2)MyISAM存储引擎
MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些联机分析处理(OLAP)数据库使用。此外,MyISAM存储引擎的另一个特点是它的缓冲池只缓存(cache)索引文件,而不缓冲数据文件,这和大多数的数据库都非常不同。
3)NDB存储引擎
NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,但不同的是Oracle RAC使用share everything架构,而NDB使用share nothing架构。
NDB的特点是数据全部放在内存中,因此主键查找(primary key lookups)的速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性的提高数据库性能。
NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层,复杂连接操作造成的网络开销巨大,因此查询速度慢。
4)Memory存储引擎
Memory存储引擎(HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或崩溃,表中数据将全部丢失,它非常适合存储临时数据的临时表。Mymory存储引擎默认使用哈希索引,而不是B+树索引。
使用限制:Memory存储引擎只支持表锁,并发性能差,并且不支持文本(TEXT)和二进制大对象(BIOB)列类型,对于变长字段(varchar)是按照定长字段(char)存储的,会浪费内存。
5)Archive存储引擎
Archivie存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引。Archive存储引擎使用zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1:10。Archivie存储引擎非常适合存储归档数据,如日志信息。
6)Federated存储引擎
Federated存储疫情并不存放数据,它只是指向一台远程MySQL数据库服务器上的表,支持此MySQL数据库表,不支持异构数据库表。
7)Maria存储引擎
Maria存储引擎设计目标主要是为了取代原有的MyISAM存储引擎。
特点是:支持缓存数据和索引文件,应用了行锁设计,提供了多版本并发控制(MVCC)功能,支持事务和非事务安全的选项,以及更好的二进制大对象(BIOB)字符类型的处理性能。
二、存储引擎比较
下图取自MySQL官方手册。
