第18章 替代存储引擎
目录
存储引擎是 MySQL 组件,负责处理不同表类型的 SQL 操作。InnoDB
是默认的通用存储引擎,Oracle 建议在大多数情况下使用它(在 MySQL 8.4 中,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: 支持事务、行级锁定和外键
Transactions: YES
XA: YES
Savepoints: YES
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: identical MyISAM 表的集合
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null 存储引擎(你写入的任何内容都会消失)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM 存储引擎
Transactions: NO
XA: NO
Savepoints: NO
...
本章涵盖了特殊用途 MySQL 存储引擎的使用场景。它不涵盖默认的 InnoDB
存储引擎或 NDB
存储引擎,这些引擎在 第17章 Innodb存储引擎 和 第25章 MySQL NDB Cluster 8.4 中有描述。对于高级用户,它还包含了可插拔存储引擎架构的描述(见 第18.11章 MySQL 存储引擎架构概述)。
关于商业 MySQL 服务器-binaries 中的功能,请查看 MySQL 版本,在 MySQL 网站上。可用的存储引擎可能取决于您使用的 MySQL 版本。
关于 MySQL 存储引擎的常见问题的答案,请见第A.2节,“MySQL 8.4 FAQ: Storage Engines”.
-
InnoDB
: MySQL 8.4 的默认存储引擎。InnoDB
是一个事务安全(ACID compliant)的存储引擎,可以实现提交、回滚和崩溃恢复,以保护用户数据。InnoDB
使用行级锁定(不升级到更粗粒度锁定)和 Oracle 风格的一致非锁定读取来提高多用户并发性能。InnoDB
将用户数据存储在聚簇索引中,以减少基于主键的常见查询的 I/O。为了保持数据一致性,InnoDB
也支持外键约束。关于InnoDB
的更多信息,请见第17章《Innodb存储引擎》。 -
MyISAM
: 这些表具有小的 footprint。 表级锁定 限制了读写工作负载的性能,因此通常用于只读或读多的工作负载配置中。 -
Memory
: 将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。这引擎曾经称为HEAP
引擎。其用例正在减少;InnoDB
的缓冲池内存区域提供了通用的和可靠的方式来保持大多数或所有数据在内存中,并且NDBCLUSTER
提供了快速的键值查找功能来处理大量分布式数据集。 -
CSV
: 这些表实际上是文本文件,其中包含逗号分隔的值。CSV 表允许您将数据导入或导出到 CSV 格式,以便与读写同格式的脚本和应用程序交换数据。由于 CSV 表不支持索引,您通常在正常操作中将数据存储在InnoDB
表中,然后在导入或导出阶段使用 CSV 表。 -
Archive
: 这些紧凑、未索引的表旨在存储和检索大量的历史、存档或安全审核信息。 -
Blackhole
: Blackhole 存储引擎接受但不存储数据,类似于 Unix/dev/null
设备。查询总是返回空集。这些表可以在复制配置中使用,发送 DML 语句到副本服务器,但源服务器不保存数据副本。 -
NDB
(也称为NDBCLUSTER
): 这款集群数据库引擎特别适用于需要最高可能的 uptime 和可用性的应用程序。 -
Merge
: 允许 MySQL DBA 或开发者将一系列相同的MyISAM
表逻辑组合并将其作为一个对象引用。非常适用于大规模数据仓库环境。 -
Federated
: 提供了将多个物理服务器链接到一个逻辑数据库的能力。非常适用于分布式或数据仓库环境。 -
Example
: 这款引擎在 MySQL 源代码中作为示例,展示了如何开始编写新的存储引擎。主要对开发者有兴趣。该存储引擎是一个“stub”,不能存储或检索数据。
您不需要将整个服务器或模式限制在同一个存储引擎上。您可以为任何表指定存储引擎。例如,一个应用程序可能使用大多数InnoDB
表,一个CSV
表用于将数据导出到电子表格,并一些MEMORY
表用于临时工作区。
选择存储引擎
MySQL 提供的各种存储引擎都是为了满足不同的使用场景。以下表格提供了 MySQL 提供的存储引擎概述,以下表格后面有解释性注释。
表18.1 存储引擎功能总结
功能 | MyISAM | 内存 | InnoDB | 归档 | NDB |
---|---|---|---|---|---|
B树索引 | 是 | 是 | 是 | 否 | 否 |
备份/点时恢复(注1) | 是 | 是 | 是 | 是 | 是 |
集群数据库支持 | 否 | 否 | 否 | 否 | 是 |
聚簇索引 | 否 | 否 | 是 | 否 | 否 |
压缩数据 | 是(注2) | 否 | 是 | 是 | 否 |
数据缓存 | 否 | N/A | 是 | 否 | 是 |
加密数据 | 是(注3) | 是(注3) | 是(注4) | 是(注3) | 是(注5) |
外键支持 | 否 | 否 | 是 | 否 | 是 |
全文搜索索引 | 是 | 否 | 是(注6) | 否 | 否 |
空间数据类型支持 | 是 | 否 | 是 | 是 | 是 |
空间索引支持 | 是 | 否 | 是(注7) | 否 | 否 |
哈希索引 | 否 | 是 | 否(注8) | 否 | 是 |
索引缓存 | 是 | N/A | 是 | 否 | 是 |
锁定粒度 | 表 | 表 | 行 | 行 | 行 |
MVCC | 否 | 否 | 是 | 否 | 否 |
复制支持(注1) | 是 | 有限(注9) | 是 | 是 | 是 |
存储限制 | 256TB | RAM | 64TB | 无 | 384EB |
T树索引 | 否 | 否 | 否 | 否 | 是 |
事务 | 否 | 否 | 是 | 否 | 是 |
更新数据字典统计 | 是 | 是 | 是 | 是 | 是 |
注释:
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 内部使用哈希索引来实现 Adaptive Hash Index 功能。
9. 请查看本节后面的讨论。