1. 前言
插件式存储引擎是MySQL数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据、是否需要使用事务等。MySQL默认支持多种存储引擎,以适用于不同领域的数据应用需要,用户可以通过选择使用不同的存储引擎提高应用的效率,提供灵活的存储,用户甚至可以按照自己的需要定制和是用自己的存储引擎,以实现最大程度的可定制性。
MySQL 5.0支持的存储引擎包括:
- MyISAM(默认:MySQL 5.5之前)
- InnoDB(提供事务安全表)(默认::MySQL 5.5之后)
- BDB(提供事务安全表)
- MEMORY
- MERGE
- EXAMPLE
- NDB Cluster
- ARCHIVE
- CSV
- BLACKHOLE
- FEDERATED
- ……
2. 各种存储引擎的特性
特点 | MyISAM | InnoDB | MEMORY | MERGE | NDB |
---|---|---|---|---|---|
存储限制 | 有 | 64TB | 有 | 没有 | 有 |
事务安全 | 支持 | ||||
锁机制 | 表锁 | 行锁 | 表锁 | 表锁 | 行锁 |
B 树索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | 支持 | ||
索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
数据可压缩 | 支持 | ||||
空间使用 | 低 | 高 | N/A | 低 | 低 |
内存使用 | 低 | 高 | 中等 | 低 | 高 |
批量插入速度 | 高 | 低 | 高 | 高 | 高 |
支持外键 | 支持 |
2.1 MyISAM
MyISAM是MySQL默认的存储引擎。MyISAM不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求或者以 SELECT、INSERT为主的应用基本上都可以使用这个引擎来创建表。
每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但扩展名分别是:
- .frm(存储表定义);
- .MYD(MYData,存储数据);
- .MYI(MYIndex,存储索引);
数据文件和索引文件可以放置在不同的目录,平均分布IO,获取更快的速度。
2.2 InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
其在使用过程中不同于使用其他存储引擎的表的特点如下:
- 自动增长列:自增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。
- 外键约束
- 存储方式:存储表和索引有以下两种方式:
- 使用共享表空间存储:这种方式创建的表的表结构保存在
.frm
文件中,数据和索引保存在innodb_data_home_dir
和innodb_data_file_path
定义的表空间中,可以是多个文件。 - 使用多表空间存储:这种方式创建的表的表结构仍然保存在
.frm
文件中,但是每个表的数据和索引单独保存在.ibd
中。如果是个分区表,则每个分区对应单独的.ibd
文件,文件名是表名 + 分区名
,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表的IO均匀分布在多个磁盘上。
- 使用共享表空间存储:这种方式创建的表的表结构保存在
2.3 MEMORY
MEMORY存储引擎使用存在于内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件,格式是.frm
。MEMORY类型的表访问非常地快,因为它的数据都放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
2.4 MERGE
MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,MERGE表本身并没有数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部MyISAM表进行的。
2.5 TokuDB
TokuDB是第三方存储引擎,是一个高性能、支持事务处理的MySQL和MariaDB的存储引擎,具有高扩展性、高压缩率、高效的写入性能,支持大多数在线DDL操作。
点击进入TokuDB下载地址
TokuDB主要有以下特性:
- 使用Fractal树索引保证高效的插入性能
- 优秀的压缩特性,比InnoDB高近10倍
- Hot Schema Changes特性支持在线创建索引和添加、删除属性列等DDL操作
- 使用Bulk Loader达到快速加载大量数据
- 提供了主从延迟消除技术
- 支持ACID和MVCC
TokuDB官网连接
TokuDB适用的场景:
- 日志数据,因为日志通常插入频繁且存储量大
- 历史数据,通常不会再有写操作,可以利用TokuDB的高压缩特性进行存储
- 在线DDL较频繁的场景,使用TokuDB可以大大增加系统的可用性