# 第 16 章 替代存储引擎

目录

16.1 设置存储引擎

16.2 MyISAM 存储引擎

16.2.1 MyISAM 启动选项

16.2.2 键所需空间

16.2.3 MyISAM 表存储格式

16.2.4 MyISAM 表问题

16.3 MEMORY存储引擎

16.4 CSV 存储引擎

16.4.1 修复和检查 CSV 表

16.4.2 CSV 限制

16.5 ARCHIVE 存储引擎

16.6 黑洞存储引擎

16.7 MERGE存储引擎

16.7.1 MERGE 表的优缺点

16.7.2 合并表问题

16.8 联合存储引擎

16.8.1 联邦存储引擎概述

16.8.2 如何创建 FEDERATED 表

16.8.3 联合存储引擎注意事项和提示

16.8.4 联合存储引擎资源

16.9 示例存储引擎

16.10 其他存储引擎

16.11 MySQL存储引擎架构概述

16.11.1 可插拔存储引擎架构

16.11.2 通用数据库服务器层

存储引擎是处理不同表类型的 SQL 操作的 MySQL 组件。InnoDB是默认且最通用的存储引擎,Oracle 建议将其用于表,但特殊用例除外。(这创建表MySQL 8.0 中的语句创建InnoDB默认情况下的表格。)

MySQL 服务器使用可插拔的存储引擎架构,使存储引擎能够加载到正在运行的 MySQL 服务器中或从其中卸载。

要确定您的服务器支持哪些存储引擎,请使用显示引擎陈述。中的值支持列指示是否可以使用引擎。一个值是的,, 要么默认表示引擎可用、不可用或可用且当前设置为默认存储引擎。

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存储引擎或新开发银行涵盖的存储引擎第 15 章,InnoDB 存储引擎第 23 章,MySQL NDB 集群 8.0.对于高级用户,它还包含对可插拔存储引擎架构的描述(参见第 16.11 节,“MySQL 存储引擎架构概述”)。

有关商业 MySQL 服务器二进制文件中提供的功能的信息,请参阅MySQL 版本 (opens new window),在 MySQL 网站上。可用的存储引擎可能取决于您使用的 MySQL 版本。

有关 MySQL 存储引擎的常见问题解答,请参阅第 A.2 节,“MySQL 8.0 常见问题解答:存储引擎”.

# MySQL 8.0 支持的存储引擎

  • InnoDB: MySQL 8.0 中默认的存储引擎。InnoDB是用于 MySQL 的事务安全(符合 ACID)存储引擎,具有提交、回滚和崩溃恢复功能以保护用户数据。InnoDB行级锁定(不升级到更粗粒度的锁定)和 Oracle 风格的一致非锁定读取提高了多用户并发性和性能。InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的 I/O。为了保持数据完整性,InnoDB也支持外键参照完整性约束。有关更多信息InnoDB, 看第 15 章,InnoDB 存储引擎.

  • MyISAM:这些表占用空间小。表级锁定限制了读/写工作负载的性能,因此它通常用于 Web 和数据仓库配置中的只读或以读取为主的工作负载。

  • 记忆:将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。这台发动机以前被称为引擎。它的用例正在减少;InnoDB其缓冲池内存区域提供了一种通用且持久的方式来将大部分或所有数据保存在内存中,并且NDBCLUSTER为庞大的分布式数据集提供快速的键值查找。

  • CSV: 它的表格实际上是带有逗号分隔值的文本文件。CSV 表允许您以 CSV 格式导入或转储数据,以便与读取和写入相同格式的脚本和应用程序交换数据。由于 CSV 表没有索引,因此您通常将数据保存在InnoDB在正常操作期间使用表,并且仅在导入或导出阶段使用 CSV 表。

  • 档案:这些紧凑的未索引表旨在存储和检索大量很少引用的历史、归档或安全审计信息。

  • 黑洞:黑洞存储引擎接受但不存储数据,类似于Unix/dev/null设备。查询总是返回一个空集。这些表可用于复制配置,其中 DML 语句被发送到副本服务器,但源服务器不保留自己的数据副本。

  • 新开发银行(也称为NDBCLUSTER):这种集群数据库引擎特别适用于需要尽可能高的正常运行时间和可用性的应用程序。

  • 合并:使 MySQL DBA 或开发人员能够在逻辑上对一系列相同的MyISAM表并将它们作为一个对象引用。适用于 VLDB 环境,例如数据仓库。

  • 联合的:提供链接不同的 MySQL 服务器以从多个物理服务器创建一个逻辑数据库的能力。非常适合分布式或数据集市环境。

  • 例子:这个引擎作为 MySQL 源代码中的一个示例,说明了如何开始编写新的存储引擎。它主要是开发人员感兴趣的。存储引擎是一个什么都不做的“存根”。您可以使用此引擎创建表,但无法在其中存储或检索数据。

    您不限于对整个服务器或架构使用相同的存储引擎。您可以为任何表指定存储引擎。例如,一个应用程序可能主要使用InnoDB表,有一个CSV用于将数据导出到电子表格的表格和一些记忆临时工作区的表。

选择存储引擎

MySQL 提供的各种存储引擎在设计时考虑了不同的用例。下表概述了 MySQL 提供的一些存储引擎,并在表后提供了澄清说明。

表 16.1 存储引擎功能摘要

特征 MyISAM 记忆 InnoDB 档案 新开发银行
B树索引 是的 是的 是的
备份/时间点恢复(注 1) 是的 是的 是的 是的 是的
集群数据库支持 是的
聚集索引 是的
压缩数据 是(注2) 是的 是的
数据缓存 不适用 是的 是的
加密数据 是(注 3) 是(注 3) 是(注 4) 是(注 3) 是(注 3)
外键支持 是的 是(注 5)
全文检索索引 是的 是(注 6)
地理空间数据类型支持 是的 是的 是的 是的
地理空间索引支持 是的 是(注 7)
哈希索引 是的 否(注 8) 是的
索引缓存 是的 不适用 是的 是的
锁定粒度 桌子 桌子
MVCC 是的
复制支持(注 1) 是的 有限(注 9) 是的 是的 是的
存储限制 256TB 内存 64TB 没有 384EB
T-树索引 是的
交易 是的 是的
更新数据字典的统计信息 是的 是的 是的 是的 是的

笔记:

  1. 在服务器中实现,而不是在存储引擎中。

  2. 仅当使用压缩行格式时才支持压缩的 MyISAM 表。使用 MyISAM 压缩行格式的表是只读的。

  3. 通过加密功能在服务器中实现。

  4. 通过加密功能在服务器中实现;在 MySQL 5.7 及更高版本中,支持静态数据加密。

  5. MySQL Cluster NDB 7.3 及更高版本中提供了对外键的支持。

  6. MySQL 5.6 及更高版本提供对 FULLTEXT 索引的支持。

  7. MySQL 5.7 及更高版本中提供了对地理空间索引的支持。

  8. InnoDB 在内部使用哈希索引来实现其自适应哈希索引功能。

  9. 请参阅本节后面的讨论。