目录
存储引擎是 MySQL 的组件,负责处理不同表类型的 SQL 操作。InnoDB
是默认的通用存储引擎,Oracle 建议除非有特殊用例,否则使用它来创建表。(MySQL 8.3 中的 CREATE TABLE
语句默认创建 InnoDB
表。)
MySQL 服务器使用可插拔存储引擎架构,可以在运行中的 MySQL 服务器中加载和卸载存储引擎。
要确定服务器支持哪些存储引擎,请使用 SHOW ENGINES
语句。支持列中的值指示引擎是否可用。值为 YES
、NO
或 DEFAULT
,分别表示引擎可用、不可用或可用且当前设置为默认存储引擎。
mysql> 显示引擎\G
*************************** 1. 行 ***************************
引擎: PERFORMANCE_SCHEMA
支持: 是
注释: 性能模式
事务: 否
XA: 否
保存点: 否
*************************** 2. 行 ***************************
引擎: InnoDB
支持: 默认
注释: 支持事务、行级锁定和外键
事务: 是
XA: 是
保存点: 是
*************************** 3. 行 ***************************
引擎: MRG_MYISAM
支持: 是
注释: 相同的 MyISAM 表集合
事务: 否
XA: 否
保存点: 否
*************************** 4. 行 ***************************
引擎: BLACKHOLE
支持: 是
注释: /dev/null 存储引擎(你写入的任何内容都会消失)
事务: 否
XA: 否
保存点: 否
*************************** 5. 行 ***************************
引擎: MyISAM
支持: 是
注释: MyISAM 存储引擎
事务: 否
XA: 否
保存点: 否
...
本章涵盖了特殊用途的 MySQL 存储引擎的使用场景。它不涵盖默认的 InnoDB
存储引擎或 NDB
存储引擎,这些内容将在 第 17 章,《InnoDB 存储引擎》 和 第 25 章,《MySQL NDB 集群 8.3》 中涵盖。对于高级用户,它还包含了可插拔存储引擎架构的描述(见 第 18.11 节,《MySQL 存储引擎架构概述》)。
有关商业 MySQL 服务器二进制文件中提供的功能信息,请参阅 MySQL 版本,在 MySQL 网站上。可用的存储引擎可能取决于您使用的 MySQL 版本。
有关 MySQL 存储引擎的常见问题的答案,请参阅 附录 A.2,《MySQL 8.3 FAQ:存储引擎》。
MySQL 8.3 支持的存储引擎
-
InnoDB
:MySQL 8.3 中的默认存储引擎。InnoDB
是一个事务安全(ACID 兼容)的存储引擎,具有提交、回滚和崩溃恢复功能,以保护用户数据。InnoDB
行级锁定(无需升级到粗粒度锁)和 Oracle 风格的一致非锁定读取提高了多用户并发性和性能。InnoDB
将用户数据存储在聚簇索引中,以减少常见查询的 I/O。InnoDB
还支持FOREIGN KEY
参考完整性约束。有关InnoDB
的更多信息,请参阅 第 17 章,《InnoDB 存储引擎》。 -
MyISAM
:这些表具有小型 footprint。表级锁定 限制了读写工作负载的性能,因此通常用于只读或主要读取的 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 服务器链接在一起以创建一个逻辑数据库的能力。非常适合分布式或数据 mart 环境。 -
Example
:该引擎在 MySQL 源代码中作为示例,展示了如何开始编写新的存储引擎。它主要对开发人员感兴趣。该存储引擎是一个 “stub”,不执行任何操作。您可以创建该引擎的表,但不能在其中存储或检索数据。
您不必将整个服务器或模式限制为使用同一个存储引擎。您可以为任何表指定存储引擎。例如,应用程序可能主要使用 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 树索引 | 否 | 否 | 否 | 否 | 是 |
事务 | 否 | 否 | 是 | 否 | 是 |
更新数据字典统计信息 | 是 | 是 | 是 | 是 | 是 |
注释:
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. 请参阅本节后面的讨论。