MySQL存储引擎

由于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官方手册。

MySQL存储引擎相关特性比较

发表评论

邮箱地址不会被公开。 必填项已用*标注