官方文档地址:Chapter 16 Alternative Storage Engines
16.1 Setting the Storage Engine
16.2 The MyISAM Storage Engine
16.3 The MEMORY Storage Engine
16.4 The CSV Storage Engine
16.5 The ARCHIVE Storage Engine
16.6 The BLACKHOLE Storage Engine
16.7 The MERGE Storage Engine
16.8 The FEDERATED Storage Engine
16.9 The EXAMPLE Storage Engine
16.10 Other Storage Engines
16.11 Overview of MySQL Storage Engine Architecture
存储引擎是 MySQL 组件,用于处理不同表类型的 SQL 操作。InnoDB
是默认的、最通用的存储引擎,Oracle 建议除了特殊的用例外,其他表都使用InnoDB
。(MySQL 8.0 中的CREATE TABLE
语句默认创建的就是InnoDB
表。)
MySQL 服务器使用可插拔存储引擎的架构,使存储引擎可以在 MySQL 服务器运行中的实现加载或卸载。
要确定您的服务器支持哪些存储引擎,请使用SHOW ENGINES
语句。Support
列中的值表示引擎是否可以使用。YES
表示该引擎可用,NO
表示该引擎不可用,DEFAULT
表示该引擎可用,并且是默认存储引擎。
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
...
本章涵盖了特殊用途的 MySQL 存储引擎的用例。不包括默认的InnoDB
存储引擎和NDB
存储引擎,这两个分别在 第15章 InnoDB 存储引擎 和 第23章 MySQL NDB Cluster 8.0 介绍。对于高级用户,它还包含了可插拔存储引擎架构的描述(见 16.11 MySQL 存储引擎架构概述)。
可用的存储引擎可能取决于您使用的 MySQL 版本。
关于 MySQL 存储引擎的常见问题请参见 A.2 MySQL 8.0 FAQ: storage engines。
MySQL 8.0 支持的存储引擎
- InnoDB:MySQL 8.0 默认的存储引擎。
InnoDB
是一个事务安全(符合 ACID)的 MySQL 存储引擎,具有提交、回滚和崩溃恢复功能,以保护用户数据。InnoDB
行级锁(没有升级为更粗粒度的锁)和 Oracle 风格的一致性非锁定读提高了多用户并发性和性能。InnoDB
将用户数据存储在聚集索引中,以减少常见的基于主键的查询的 I/O。为了维护数据完整性,InnoDB
还支持外键引用完整性约束。关于InnoDB
的更多信息,请参见 第15章 InnoDB 存储引擎。 - MyISAM:这些表占用空间小。表级锁定限制了读/写工作负载中的性能,因此通常用于 Web 和数据仓库配置中的只读或以读为主的工作负载。
- Memory:将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。这个引擎以前被称为
HEAP
引擎。现在用的越来越少了,因为:InnoDB
通过其缓冲池内存区域提供了一种通用且持久的方式来将大部分或全部数据保存在内存中,而NDBCLUSTER
则为大型分布式数据集提供了快速的键值查找。 - CSV:它的表实际上是带有逗号分隔符的文本文件。
CSV
表允许您以CSV
格式导入或转储数据,以便与读写相同格式的脚本和应用程序交换数据。由于CSV
表没有被索引,通常在正常操作时将数据保存在InnoDB
表中,只在导入或导出阶段使用CSV
表。 - Archive:这些紧凑的、没有索引的表用于存储和检索大量很少引用的历史、归档或安全审计信息。
- Blackhole:黑洞存储引擎接受但不存储数据,类似于 Unix
/dev/null
设备。查询总是返回一个空集。这些表可用于复制配置,其中DML
语句被发送到复制服务器,但源服务器不保留自己的数据副本。 - NDB(也叫 NDBCLUSTER):这种集群数据库引擎特别适合要求尽可能高的正常运行时间和可用性的应用程序。
- Merge:允许 MySQL DBA 或开发人员在逻辑上对一系列相同的
MyISAM
表进行分组,并将它们作为一个对象引用。适合于 VLDB 环境,比如数据仓库。 - Federated:提供链接独立的 MySQL 服务器的能力,从许多物理服务器创建一个逻辑数据库。非常适合分布式或数据集市环境。
- Example:这个引擎在 MySQL 源代码中充当示例,演示如何开始编写新的存储引擎。主要是开发人员对它感兴趣。这个存储引擎是一个什么都不做的“存根”。您可以使用这个引擎创建表,但是不能在表中存储数据,也不能从表中检索数据。
您不必局限于对整个服务器或架构使用相同的存储引擎。您可以为任何表指定存储引擎。例如,应用程序可能主要使用InnoDB
表,其中一个CSV
表用于将数据导出到电子表格,一些MEMORY
表用于临时工作区。
选择存储引擎
MySQL 提供的各种存储引擎是根据不同的用例设计的。下表概述了 MySQL 提供的一些存储引擎,明确了一些注意事项。
存储引擎特性概述
特点 | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree 索引 | Yes | Yes | Yes | No | No |
备份/时间点恢复 (注1) | Yes | Yes | Yes | Yes | Yes |
集群数据库支持 | No | No | No | No | Yes |
聚集索引 | No | No | Yes | No | No |
数据压缩 | Yes (注2) | No | Yes | Yes | No |
数据缓存 | No | N/A | Yes | No | Yes |
数据加密 | Yes (注3) | Yes (注3) | Yes (注4) | Yes (注3) | Yes (注3) |
外键支持 | No | No | Yes | No | Yes (注5) |
全文搜索索引 | Yes | No | Yes (注6) | No | No |
地理空间数据类型支持 | Yes | No | Yes | Yes | Yes |
地理空间索引支持 | Yes | No | Yes (注7) | No | No |
Hash 索引 | No | Yes | No (注8) | No | Yes |
索引缓存 | Yes | N/A | Yes | No | Yes |
锁粒度 | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
复制支持(注1) | Yes | Limited (注9) | Yes | Yes | Yes |
存储限制 | 256TB | RAM | 64TB | None | 384EB |
T-tree 索引 | No | No | No | No | Yes |
交易 | No | No | Yes | No | Yes |
更新数据字典的统计信息 | Yes | Yes | Yes | Yes | Yes |
注释:
- 在服务器中实现,而不是在存储引擎中。
- 只有使用压缩行格式时,才支持压缩的
MyISAM
表。使用MyISAM
压缩行格式的表是只读的。 - 在服务器端通过加密功能实现。
- 在服务器端通过加密功能实现;在 MySQL 5.7 和更高版本中,支持数据静止加密。
- 在 MySQL NDB Cluster 7.3和更高版本中支持外键。
- 在 MySQL 5.6 和更高版本中支持全文索引。
- MySQL 5.7 和更高版本中提供了对地理空间索引的支持。
InnoDB
内部利用哈希索引来实现自适应哈希索引特性。- 请参阅本节后面的讨论。