存储引擎是基于表的,而不是数据库。
InnoDB
存储引擎
InnoDB
存储引擎支持事务,其设计目标主要是面向在线事务处理(OLTP, Online Transaction Processing)
的应用。其特点是行锁设计、支持外键,并支持类似于Oracle
的非锁定读,即默认读取操作不会产生锁。
InnoDB
通过使用多版本并发控制(MVCC, Multi-Version Concurrency Control)
来获得高并发性,并且实现了SQL
标准的4种隔离级别,默认为Repeatable
级别。同时使用一种被称为next-key locking
的策略来避免幻读(phantom)
现象的产生。InnoDB
存储引擎还提供了插入缓存(insert buffer)
、二次写(double write)
、自适应哈希索引(adaptive hash index)
、预读(read ahead)
等高性能和高可用的功能。
对于表中数据的存储,InnoDB
存储引擎采用了聚集(clustered)
的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显示地在表定义时指定主键,InnoDB
存储引擎会为每一行生成一个6字节的ROWID
,并以此作为主键。
实践证明,InnoDB
存储引擎具备高可用性、高性能以及高可扩展性。
MyISAM
存储引擎
MyISAM
存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP(On-line Analytical Processing)
数据库应用。MyISAM
的缓冲池只缓存索引文件,而不缓存数据文件,这和绝大多数数据库都非常的不同。MyISAM
存储引擎由MYD
和MYI
组成,MYD
用来存放数据文件,MYI
用来存放索引文件。
Memory
存储引擎
Memory
存储引擎(之前称HEAP
存储引擎)将表中的数据存放在内存中,如果数据库重启或发生故障崩溃,表中的数据将会消失。它非常适合用于存储临时数据的临时表,以及数据仓库中的维度表。Memory
存储引擎默认使用哈希索引,而不是我们熟悉的B+
树索引。
Memory
存储引擎非常快,但它只支持表锁,并发性能较差,并且不支持TEXT
和BLOB
。最重要的是,存储变长字段(varchar)时是按照定长字段(char)的方式进行的,因此会浪费内存,不过eBay工程师已解决此问题。
MySQL
数据库使用Memory
存储引擎作为临时表来存放查询的中间结果集(intermediate result)
。如果中间结果集大于Memory
存储引擎表的容量设置,又或者中间结果含有TEXT
或BLOB
列类型字段,则MySQL
数据库会把其转换到MyISAM
存储引擎表而存放到磁盘中。
Archive
存储引擎
Archive
存储引擎只支持insert
和select
操作,从MySQL 5.1
开始支持索引。Archive
存储引擎使用zlib
算法将数据行(row)
进行压缩后存储,压缩比一般可以达1:10
。Archive
存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。
Federated
存储引擎
Federated
存储引擎并不存放数据,它只是指向一台远程MySQL
数据库服务器上的表。目前只支持MySQL
数据库表,不支持异构数据库表。
Maria
存储引擎
Maria
存储引擎是由MySQL
创始人Michael Widenius
新开发的引擎,设计目标主要是用来取代原有的MyISAM
存储引擎,从而成为MySQL
的默认存储引擎。Maria支持缓存数据和索引文件,应用了行锁设计,提供了MVCC
功能,支持事务和非事务安全的选项,以及更好的BLOB
字符类型的处理性能。