数据库笔记:MySQL存储引擎简介

MySQL由以下几部分组成:

MySQl数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。

MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发。

需要特别注意的是,存储引擎是基于表的,而不是数据库。

MySQL存储引擎

存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。

由于MySQL数据库的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎。如果用户对某一种存储引擎的性能或功能不满意,可以通过修改源码来得到想要的特性,这就是开源带给我们的方便。

由于MySQL数据库开源特性,存储引擎可以分为MySQL官方存储引擎和第三方存储引擎。有些第三方存储引擎很强大,如大名鼎鼎的InnoDB存储引擎,后来被Oracle收购。

InnoDB存储引擎

InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。

InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身进行管理。从MySQL4.1版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。此外,InnoDB存储引擎支持用裸设备(row disk)来建立其表空间。

InnoDB通过使用对版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key locking的策略来避免幻读现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按照主键的顺序进行存放。如果没有显示地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。

InnoDB存储引擎是MySQL数据库最为常用的一种引擎,而Facebook、Google、Yahoo!等公司的成功应用已经证明了InnoDB存储引擎具备的高可用性、高性能以及高可扩展性。

MyISAM

MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL5.5.8版本之前,MyISAM存储引擎是默认的存储引擎。

数据库系统和文件系统很大的一个不同之处在于对事务的支持,然而MyISAM存储引擎不支持事务。究其根本原因,其实也不难理解。试想用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有ETL这些操作,只是简单的报表查询是否还需要事务的支持呢?此外,MyISAM存储引擎另一个与众不同的地方是它的缓冲池只缓存索引文件,而不缓存数据文件,这点和大多数的数据库都非常不同。

MyISAM存储引擎由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。在MySQL5.0版本之前,MyISAM默认支持的表大小为4GB, 从MySQL5.0版本开始,MyISAM默认支持256TB的单表数据,这足够满足一般的应用需求。

注意:

对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据的大部分数据库不相同。此外,在MySQL5.1.23版本之前,无论是32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4GB。在之后的版本中,64位系统可以支持大于4GB的索引缓冲区。

其他存储引擎

除了上面提到的两个主要的存储引擎之外,MySQL数据库还有很多其他的存储引擎,包括:

它们各有特色,各自都有自己的使用场景,细节以后再慢慢了解。

各存储引擎之间的比较

存储引擎是MySQL体系结构的核心,下图取自MySQL得官方手册,简单比较了各个存储引擎之间的区别,包括存储容量的限制、事务支持、锁的粒度、MVCC支持、支持的索引、备份和复制等。