第 15 章备用存储引擎
目录
存储引擎是 MySQL 组件,用于处理不同 table 类型的 SQL 操作。 InnoDB是默认的且用途最广的存储引擎,Oracle 建议将其用于 table(特殊用例除外)。 (默认情况下,MySQL 5.7 中的CREATE TABLE语句创建InnoDB
table。)
MySQL Server 使用可插拔的存储引擎体系结构,该体系结构使存储引擎可以加载到正在运行的 MySQL 服务器或从正在运行的 MySQL 服务器上卸载。
要确定服务器支持哪些存储引擎,请使用SHOW ENGINES语句。 Support
列中的值指示是否可以使用引擎。值YES
,NO
或DEFAULT
table 示引擎可用,不可用或可用,并且当前已设置为默认存储引擎。
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 存储引擎的用例。它不涵盖第 14 章,InnoDB 存储引擎和第 21 章,MySQL NDB 群集 7.5 和 NDB 群集 7.6中涵盖的默认InnoDB存储引擎或NDB存储引擎。对于高级用户,本章还包含对可插拔存储引擎体系结构的说明(请参见第 15.11 节“ MySQL 存储引擎体系结构概述”)。
有关商业 MySQL Server 二进制文件中提供的功能的信息,请参见 MySQL 网站上的MySQL Editions。可用的存储引擎可能取决于您使用的 MySQL 版本。
有关 MySQL 存储引擎的常见问题的答案,请参见第 A.2 节“ MySQL 5.7 FAQ:存储引擎”。
MySQL 5.7 支持的存储引擎
-
InnoDB:MySQL 5.7 中的默认存储引擎。
InnoDB
是用于 MySQL 的事务安全(符合 ACID)存储引擎,具有提交,回滚和崩溃恢复功能以保护用户数据。InnoDB
行级锁定(无需升级为更粗粒度的锁定)和 Oracle 风格的一致非锁定读取可提高多用户并发性和性能。InnoDB
将用户数据存储在聚集索引中,以减少基于主键的常见查询的 I/O。为了保持数据完整性,InnoDB
还支持FOREIGN KEY
引用完整性约束。有关InnoDB
的更多信息,请参见第 14 章,InnoDB 存储引擎。 -
MyISAM:这些桌子的空间很小。 Table-level locking限制了读/写工作负载的性能,因此通常在 Web 和数据仓库配置中的只读或大部分工作负载中使用。
-
Memory:将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。该引擎以前称为
HEAP
引擎。它的用例正在减少;InnoDB
及其缓冲池内存区域提供了一种通用且持久的方式来将大多数或所有数据保留在内存中,而NDBCLUSTER
提供了针对大型分布式数据集的快速键值查找。 -
CSV:它的 table 实际上是带有逗号分隔值的文本文件。 CSVtable 使您可以导入或转储 CSV 格式的数据,以便与读取和写入相同格式的脚本和应用程序交换数据。由于 CSVtable 未构建索引,因此通常在正常操作期间将数据保存在
InnoDB
table 中,并且仅在导入或导出阶段使用 CSVtable。 -
Archive:这些紧凑的未索引 table 旨在用于存储和检索大量很少参考的历史,归档或安全审核信息。
-
Blackhole:Blackhole 存储引擎可以接受但不存储数据,类似于 Unix
/dev/null
设备。查询总是返回一个空集。这些 table 可用于将 DML 语句发送到从属服务器的复制配置中,但是主服务器不会保留其自己的数据副本。 -
NDB(也称为NDBCLUSTER):此群集数据库引擎特别适合要求尽可能高的正常运行时间和可用性的应用程序。
-
Merge:使 MySQL DBA 或开发人员可以在逻辑上对一系列相同的
MyISAM
table 进行分组并将它们作为一个对象引用。适用于 VLDB 环境,例如数据仓库。 -
Federated:提供了链接单独的 MySQL 服务器以从许多物理服务器创建一个逻辑数据库的能力。非常适合于分布式或数据集市环境。
-
Example:此引擎用作 MySQL 源代码中的示例,该示例说明了如何开始编写新的存储引擎。它主要是开发人员感兴趣的。存储引擎是什么都不做的“存根”。您可以使用此引擎创建 table,但是不能在其中存储数据或从中检索数据。
您不限于对整个服务器或架构使用相同的存储引擎。您可以为任何 table 指定存储引擎。例如,应用程序可能主要使用InnoDB
table,其中一个CSV
table 用于将数据导出到电子 table 格,而少数MEMORY
table 用于临时工作空间。
选择存储引擎
MySQL 随附的各种存储引擎在设计时都考虑了不同的用例。下 table 概述了 MySQL 随附的一些存储引擎,并在 table 后提供了一些说明。
table15.1 存储引擎功能摘要
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree indexes | Yes | Yes | Yes | No | No |
备份/时间点恢复 (Comments1) | Yes | Yes | Yes | Yes | Yes |
集群数据库支持 | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | 是(Comments2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | 是(Comments3) | 是(Comments3) | 是(Comments4) | 是(Comments3) | 是(Comments3) |
外键支持 | No | No | Yes | No | 是(Comments5) |
全文搜索索引 | Yes | No | 是(Comments6) | No | No |
地理空间数据类型支持 | Yes | No | Yes | Yes | Yes |
地理空间索引支持 | Yes | No | 是(Comments7) | No | No |
Hash indexes | No | Yes | 否(Comments8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
复制支持 (Comments1) | Yes | 限量(附注 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
更新数据字典的统计信息 | Yes | Yes | Yes | Yes | Yes |
Notes:
1.在服务器而不是存储引擎中实现。
2.仅在使用压缩行格式时才支持压缩 MyISAMtable。在 MyISAM 中使用压缩行格式的 table 是只读的。
3.通过加密功能在服务器中实现。
4.通过加密功能在服务器中实现;在 MySQL 5.7 和更高版本中,支持静态数据 table 空间加密。
-
MySQL Cluster NDB 7.3 和更高版本提供了对外键的支持。
-
MySQL 5.6 和更高版本提供了对 FULLTEXT 索引的 InnoDB 支持。
-
MySQL 5.7 和更高版本提供了 InnoDB 对地理空间索引的支持。
-
InnoDB 在内部将哈希索引用于其自适应哈希索引功能。
9.请参阅本节后面的讨论。