存储引擎列表
- InnoDB
- MyISAM
- Memory
- CSV
- ARCHIVE
- BLCKHOLE
- MERGE
- FEDERATED
- EXAMPLE
InnoDB
InnoDB是一个事务型引擎,也是最重要使用最广泛的存储引擎。InnoDB的设计目标是处理大量短事务,短事务大部分情况是正常提交的,很少会回滚。一般的业务处理中,应该首选InnoDB存储引擎。
InnoDB的数据存储在表空间,表空间是由一些列数据文件组成。InnoDB可以将每个表的数据和索引文件存放在单独的文件中。
InnoDB使用MVVC来支持高并发。
InnoDB支持四个事务隔离级别(四个事务隔离级别参考:事务与事务隔离级别-MySQL),通过间隙锁(next-key locking)解决幻读。间隙锁是锁住范围,间隙锁参考:MySQL官方:Next-Key Locks。
InnoDB表是基于聚簇索引建立的。
InnoDB可以在内存中创建哈希索引加速读操作,这种索引也称为:自适应哈希索引(adaptive hash index),InnoDB是不支持基于文件的哈希索引的,这个要额外注意。
InnnDB支持热备份,比如使用开源的XtraBackup可以做热备份,其他存储引擎不支持热备份。
更多InnoDB特性(官方):
MyISAM
MyISAM存储引擎也提供了大量的功能特性:全文索引、压缩、空间函数。MyISAM不支持事务和行级锁,所以崩溃后无法安全恢复。
存储
MyISAM将表存储在两个文件中:数据文件和索引文件。MyISAM可以存储的记录大小一般受限于操作系统单个文件大小和物理硬盘大小。
功能特性
锁:MyISAM是表锁,查询时对整张表加共享读锁,修改时对表加排他写锁。并发插入是业务的一个常态,MyISAM存储引擎有一个系统变量CONCURRENT INSERT用来控制并发插入行为:
- 不允许并发插入
- 表中间没有被删除的行,MyISAM允许在一个进程读表的同事,另一个进程从表尾插入记录
- 无论表中间有没有被删除的行,都允许在表尾并发插入记录
更多特性:
Memory
Memory引擎是将表结构数据存储在硬盘中,数据存放在内存中的存储引擎。因为所有的数据都存在内存中, 所以读取和写入速度非常快,因为没有磁盘I/O。但是Memory表中的数据在遇到系统崩溃、硬件错误或断电问题后数据全部丢失。
尽管如此,Memory存储引擎依然可以适用于以下场景中:
- 键值映射查询,比如:一些常量字典表
- 缓存数据
- 保存中间结果
Memory存储引擎支持哈希索引,所以查询速度快。
更多Memory存储引擎特性参考:
CSV
CSV存储引擎将数据记录到文本文件中,并且值要以逗号分割。
CSV可以在运行时将文件拷入和拷出件到数据目录中,拷入文件后可以立即在查询到数据。
功能特性
CSV存储引擎不支持索引、不支持分区、表不能存在空列,必须都是非空。
Archive
Archive存储引擎在数据写入时将数据压缩,数据压缩采用zlib无损压缩;在读取数据时将数据解压。
功能特性
压缩与解压
写入时将行数据压缩,读取时将行数据解压。
读写与排序
Archive存储引擎支持INSERT、REPLACE、SELECT,不支持DELETE、UPDATE、ORDER BY、BLOB数据类型和空间数据类型。
自增
Archive存储引擎支持自增列属性。
索引
Archive存储引擎不支持索引。
更多特性
BlockHole
BlockHole(黑洞)存储引擎会丢弃所有写入的数据,所以尝试从BlockHole表中读取数据只能得到空结果。BlockHole存储引擎定位于MySQL Server间复制数据的过滤。假设你的应用需要一部分binlog日志数据,但是MySQL Server默认是将所有binlog数据传输给复制客户端,所有的binlog有可能太大了,所以可以使用BlockHole存储引擎对binlog进行过滤。
高性能MySQL作者说他在使用BlockHole存储引擎来完成特殊复制架构时碰到很多问题,并不推荐。
Merge
Merge引擎是MyISAM引擎的一个变种,专门用来将MyISAM的表合并成一张虚拟表,这样使用MyISAM表就像使用一张表一样方便。
Fedrated
Fedrated存储引擎是用来访问远程MySQL数据库的,当你查询Fedrated存储引擎表时,Fedrated存储引擎会自动从远程读取数据,但是数据不会存储到本地表。
Example
Example是用来向MySQL数据库引擎开发人员展示如何编写一个新的存储引擎。
总结
- InnoDB只支持自适应哈希索引,这个索引是为了加速读InnoDB自动在内存建立的,但是InnoDB不支持基于文件的哈希索引
- (MySQL8.0)InnoDB表空间最大为64TB
- MyISAM存储引擎不支持事务,所以不建议InnoDB表和MyISAM表混合使用事务,因为回滚会造成问题,正常提交不会有问题
- MyISAM主要缺点是不支持事务和表锁
- 不担心丢数据就用Memory,因为内存操作,快
- 想用MySQL处理CSV文件就用CSV存储引擎
- 想要归档数据就用Achive,因为数据压缩,省磁盘空间
- 想要基于不存储数据在本地只查询远程就用Federated
参考
- MySQL可选存储引擎 https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
- InnoDB存储引擎 https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html
- Memory存储引擎 https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html
- CSV存储引擎 https://dev.mysql.com/doc/refman/8.0/en/csv-storage-engine.html
- 空间数据类型 https://dev.mysql.com/doc/refman/8.0/en/spatial-type-overview.html
- Merge存储引擎 https://dev.mysql.com/doc/refman/8.0/en/merge-storage-engine.html
- Fedrated存储引擎 https://dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html
- Example存储引擎 https://dev.mysql.com/doc/refman/8.0/en/example-storage-engine.html
- 高性能MySQL(第三版)