storage-engines.md 9.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
# 第 16 章 替代存储引擎

**目录**


[16.1 设置存储引擎](storage-engine-setting.html)


[16.2 MyISAM 存储引擎](myisam-storage-engine.html)


[16.2.1 MyISAM 启动选项](myisam-start.html)


[16.2.2 键所需空间](key-space.html)


[16.2.3 MyISAM 表存储格式](myisam-table-formats.html)


[16.2.4 MyISAM 表问题](myisam-table-problems.html)


[16.3 MEMORY存储引擎](memory-storage-engine.html)


[16.4 CSV 存储引擎](csv-storage-engine.html)


[16.4.1 修复和检查 CSV 表](se-csv-repair.html)


[16.4.2 CSV 限制](se-csv-limitations.html)


[16.5 ARCHIVE 存储引擎](archive-storage-engine.html)


[16.6 黑洞存储引擎](blackhole-storage-engine.html)


[16.7 MERGE存储引擎](merge-storage-engine.html)


[16.7.1 MERGE 表的优缺点](merge-table-advantages.html)


[16.7.2 合并表问题](merge-table-problems.html)


[16.8 联合存储引擎](federated-storage-engine.html)


[16.8.1 联邦存储引擎概述](federated-description.html)


[16.8.2 如何创建 FEDERATED 表](federated-create.html)


[16.8.3 联合存储引擎注意事项和提示](federated-usagenotes.html)


[16.8.4 联合存储引擎资源](federated-storage-engine-resources.html)


[16.9 示例存储引擎](example-storage-engine.html)


[16.10 其他存储引擎](storage-engines-other.html)


[16.11 MySQL存储引擎架构概述](pluggable-storage-overview.html)


[16.11.1 可插拔存储引擎架构](pluggable-storage.html)


[16.11.2 通用数据库服务器层](pluggable-storage-common-layer.html)

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

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

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

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

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

有关商业 MySQL 服务器二进制文件中提供的功能的信息,请参阅[*MySQL 版本*](https://www.mysql.com/products/),在 MySQL 网站上。可用的存储引擎可能取决于您使用的 MySQL 版本。

有关 MySQL 存储引擎的常见问题解答,请参阅[第 A.2 节,“MySQL 8.0 常见问题解答:存储引擎”](faqs-storage-engines.html).

## MySQL 8.0 支持的存储引擎

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

-   [`MyISAM`](myisam-storage-engine.html):这些表占用空间小。[表级锁定](glossary.html#glos_table_lock)限制了读/写工作负载的性能,因此它通常用于 Web 和数据仓库配置中的只读或以读取为主的工作负载。

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

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

-   [`档案`](archive-storage-engine.html):这些紧凑的未索引表旨在存储和检索大量很少引用的历史、归档或安全审计信息。

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

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

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

-   [`联合的`](federated-storage-engine.html):提供链接不同的 MySQL 服务器以从多个物理服务器创建一个逻辑数据库的能力。非常适合分布式或数据集市环境。

-   [`例子`](example-storage-engine.html):这个引擎作为 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.  请参阅本节后面的讨论。