目录
存储引擎是 MySQL 的组件,它们处理不同表类型的 SQL 操作。 InnoDB
是 MySQL 的默认存储引擎,也是最通用的存储引擎,Oracle 建议将它用于除特殊用例之外的所有表。(在 MySQL 9.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
存储引擎,它们分别在 第 17 章,InnoDB 存储引擎 和 第 25 章,MySQL NDB 集群 9.0 中介绍。对于高级用户,它还包含可插拔存储引擎架构的描述(请参见 第 18.11 节,“MySQL 存储引擎架构概述”)。
有关商业 MySQL Server 二进制文件中提供的功能的信息,请参见 MySQL 网站上的 MySQL 版本。可用的存储引擎可能取决于您使用的 MySQL 版本。
要了解有关 MySQL 存储引擎的常见问题的解答,请参见 第 A.2 节,“MySQL 9.0 常见问题解答:存储引擎”。
MySQL 9.0 支持的存储引擎
InnoDB
: MySQL 9.0 中的默认存储引擎。InnoDB
是 MySQL 的事务安全(符合 ACID)存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。InnoDB
行级锁定(不会升级到更粗粒度的锁定)和 Oracle 风格的一致非锁定读取提高了多用户并发性和性能。InnoDB
将用户数据存储在聚簇索引中,以减少基于主键的常见查询的 I/O 操作。为了维护数据完整性,InnoDB
还支持FOREIGN KEY
参照完整性约束。有关InnoDB
的更多信息,请参见 第 17 章,InnoDB 存储引擎。MyISAM
: 这些表的占用空间很小。 表级锁定 会限制读写工作负载的性能,因此它通常用于 Web 和数据仓库配置中的只读或以读为主的工作负载。Memory
: 将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。此引擎以前称为HEAP
引擎。它的用例正在减少;带有缓冲池内存区域的InnoDB
提供了一种通用的、持久的方式来将大多数或所有数据保留在内存中,而NDBCLUSTER
则为大型分布式数据集提供快速的键值查找。CSV
: 它的表实际上是带有逗号分隔值的文本文件。CSV 表允许您导入或转储 CSV 格式的数据,以与读取和写入相同格式的脚本和应用程序交换数据。由于 CSV 表没有索引,因此您通常在正常操作期间将数据保留在InnoDB
表中,只在导入或导出阶段使用 CSV 表。Archive
: 这些紧凑的、无索引的表旨在存储和检索大量很少引用的历史、存档或安全审计信息。Blackhole
: Blackhole 存储引擎接受但不存储数据,类似于 Unix/dev/null
设备。查询始终返回空集。这些表可用于复制配置,其中 DML 语句被发送到副本服务器,但源服务器不保留其自身的数据副本。NDB
(也称为NDBCLUSTER
):此集群数据库引擎特别适合需要最高正常运行时间和可用性的应用程序。Merge
: 使 MySQL DBA 或开发人员能够逻辑地对一系列相同的MyISAM
表进行分组,并将它们作为一个对象进行引用。非常适合 VLDB 环境(如数据仓库)。Federated
: 提供将独立的 MySQL 服务器链接起来以从多个物理服务器创建一个逻辑数据库的能力。非常适合分布式或数据仓库环境。Example
: 此引擎充当 MySQL 源代码中的示例,说明如何开始编写新的存储引擎。它主要对开发人员感兴趣。存储引擎是一个 “存根”,它什么也不做。您可以使用此引擎创建表,但不能在其中存储数据或从中检索数据。
您不受限于对整个服务器或架构使用相同的存储引擎。您可以为任何表指定存储引擎。例如,一个应用程序可能主要使用 InnoDB
表,一个 CSV
表用于将数据导出到电子表格,几个 MEMORY
表用于临时工作区。
选择存储引擎
MySQL 提供的各种存储引擎的设计考虑了不同的用例。下表概述了 MySQL 提供的一些存储引擎,并提供了表后的说明。
表 18.1 存储引擎功能摘要
功能 | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B 树索引 | 是 | 是 | 是 | 否 | 否 |
备份/时间点恢复(注 1) | 是 | 是 | 是 | 是 | 是 |
集群数据库支持 | 否 | 否 | 否 | 否 | 是 |
聚簇索引 | 否 | 否 | 是 | 否 | 否 |
压缩数据 | 是(注 2) | 否 | 是 | 是 | 否 |
数据缓存 | 否 | N/A | 是 | 否 | 是 |
加密数据 | 是(注 3) | 是(注 3) | 是(注 4) | 是(注 3) | 是(注 5) |
外键支持 | 否 | 否 | 是 | 否 | 是 |
全文搜索索引 | 是 | 否 | 是(注 6) | 否 | 否 |
地理空间数据类型支持 | 是 | 否 | 是 | 是 | 是 |
地理空间索引支持 | 是 | 否 | 是(注 7) | 否 | 否 |
哈希索引 | 否 | 是 | 否(注 8) | 否 | 是 |
索引缓存 | 是 | N/A | 是 | 否 | 是 |
锁定粒度 | 表 | 表 | 行 | 行 | 行 |
MVCC | 否 | 否 | 是 | 否 | 否 |
复制支持(注 1) | 是 | 有限(注 9) | 是 | 是 | 是 |
存储限制 | 256TB | RAM | 64TB | 无 | 384EB |
T-tree 索引 | 否 | 否 | 否 | 否 | 是 |
事务 | 否 | 否 | 是 | 否 | 是 |
更新数据字典的统计信息 | 是 | 是 | 是 | 是 | 是 |
注释
1. 在服务器中实现,而不是在存储引擎中实现。
2. 仅当使用压缩行格式时,才支持压缩 MyISAM 表。 使用压缩行格式的 MyISAM 表是只读的。
3. 在服务器中通过加密函数实现。
4. 在服务器中通过加密函数实现; 在 MySQL 5.7 及更高版本中,支持数据在休眠状态下的加密。
5. 在服务器中通过加密函数实现; 从 NDB 8.0.22 开始,加密的 NDB 备份; NDB 8.0.29 及更高版本支持透明的 NDB 文件系统加密。
6. MySQL 5.6 及更高版本支持 FULLTEXT 索引。
7. MySQL 5.7 及更高版本支持地理空间索引。
8. InnoDB 在内部为其自适应哈希索引功能使用哈希索引。
9. 请参阅本节后面的讨论。