## 16.2 MyISAM 存储引擎

[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)

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

`MyISAM`基于旧的（不再可用）`是`存储引擎，但有许多有用的扩展。

[](<>)

**表 16.2 MyISAM 存储引擎功能**

| 特征 | 支持 |
| --- | --- |
| **B树索引** | 是的 |
| **备份/时间点恢复**（在服务器中实现，而不是在存储引擎中。） | 是的 |
| **集群数据库支持** | 不 |
| **聚集索引** | 不 |
| **压缩数据** | 是（仅当使用压缩行格式时才支持压缩的 MyISAM 表。使用带有 MyISAM 的压缩行格式的表是只读的。） |
| **数据缓存** | 不 |
| **加密数据** | 是（通过加密功能在服务器中实现。） |
| **外键支持** | 不 |
| **全文检索索引** | 是的 |
| **地理空间数据类型支持** | 是的 |
| **地理空间索引支持** | 是的 |
| **哈希索引** | 不 |
| **索引缓存** | 是的 |
| **锁定粒度** | 桌子 |
| **MVCC** | 不 |
| **复制支持**（在服务器中实现，而不是在存储引擎中。） | 是的 |
| **存储限制** | 256TB |
| **T-树索引** | 不 |
| **交易** | 不 |
| **更新数据字典的统计信息** | 是的 |

每个`MyISAM`表存储在磁盘上的两个文件中。这些文件的名称以表名开头，并具有指示文件类型的扩展名。数据文件有一个`.MYD`(`MYData`） 延期。索引文件有一个`。我的我`(`MYIndex`） 延期。表定义存储在 MySQL 数据字典中。

明确指定您想要一个`MyISAM`表，表明与`引擎`表选项：

```
CREATE TABLE t (i INT) ENGINE = MYISAM;
```

在 MySQL 8.0 中，通常需要使用`引擎`指定`MyISAM`存储引擎，因为`InnoDB`是默认引擎。

您可以检查或维修`MyISAM`表与[**mysql检查**](mysqlcheck.html)客户或[**迈萨姆奇克**](myisamchk.html)效用。你也可以压缩`MyISAM`表[**myisampack**](myisampack.html)占用更少的空间。看[第 4.5.3 节，“mysqlcheck - 一个表维护程序”](mysqlcheck.html),[第 4.6.4 节，“myisamchk - MyISAM 表维护实用程序”](myisamchk.html)， 和[第 4.6.6 节，“myisampack - 生成压缩的只读 MyISAM 表”](myisampack.html).

在 MySQL 8.0 中，`MyISAM`存储引擎不提供分区支持。*分区`MyISAM`在 MySQL 8.0 中不能使用在以前版本的 MySQL 中创建的表*.有关详细信息，请参阅[第 24.6.2 节，“与存储引擎相关的分区限制”](partitioning-limitations-storage-engines.html).有关升级此类表以便它们可以在 MySQL 8.0 中使用的帮助，请参阅[第 2.11.4 节，“MySQL 8.0 中的更改”](upgrading-from-previous-series.html).

`MyISAM`表具有以下特点：

-   所有数据值都以低字节优先存储。这使得数据机和操作系统独立。二进制可移植性的唯一要求是机器使用二进制补码有符号整数和 IEEE 浮点格式。这些要求在主流机器中被广泛使用。二进制兼容性可能不适用于有时具有特殊处理器的嵌入式系统。

    首先存储数据低字节没有明显的速度损失；表行中的字节通常是未对齐的，按顺序读取未对齐字节所需的处理时间比按相反顺序读取的处理时间要多。此外，与其他代码相比，服务器中获取列值的代码不是时间关键的。

-   所有数字键值都以高字节优先存储，以允许更好的索引压缩。

-   支持大文件的文件系统和操作系统支持大文件（文件长度最大为 63 位）。

-   有一个限制（2<sup>32</sup>)<sup>2</sup>(1.844E+19) 行`MyISAM`桌子。

-   每个索引的最大数量`MyISAM`表是 64。

    每个索引的最大列数为 16。

-   最大密钥长度为 1000 字节。这也可以通过更改源并重新编译来更改。对于长度超过 250 字节的密钥，使用比默认值 1024 字节更大的密钥块大小。

-   当按排序顺序插入行时（如您使用`自动递增`列），索引树被拆分，使得高节点只包含一个键。这提高了索引树中的空间利用率。

-   内部处理一`自动递增`支持每个表的列。`MyISAM`自动更新此列[`插入`](insert.html)和[`更新`](update.html)操作。这使得`自动递增`列速度更快（至少 10%）。序列顶部的值在被删除后不会被重用。（当一个`自动递增`column 被定义为多列索引的最后一列，重复使用从序列顶部删除的值确实会发生。）`自动递增`值可以重置[`更改表`](alter-table.html)要么[**迈萨姆奇克**](myisamchk.html).

-   将删除与更新和插入混合使用时，动态大小的行碎片更少。这是通过自动组合相邻的已删除块并在下一个块被删除时扩展块来完成的。

-   `MyISAM`支持并发插入：如果一个表在数据文件中间没有空闲块，你可以[`插入`](insert.html)在其他线程从表中读取的同时将新行写入其中。由于删除行或更新具有比当前内容更多的数据的动态长度行，可能会出现空闲块。当所有空闲块都用完（填充）时，未来的插入再次变为并发。看[第 8.11.3 节，“并发插入”](concurrent-inserts.html).

-   您可以将数据文件和索引文件放在不同物理设备上的不同目录中，以获得更快的速度`数据目录`和`索引目录`表选项[`创建表`](create-table.html).看[第 13.1.20 节，“CREATE TABLE 语句”](create-table.html).

-   [`斑点`](blob.html)和[`文本`](blob.html)列可以被索引。

-   `空值`索引列中允许值。每个密钥需要 0 到 1 个字节。

-   每个字符列可以有不同的字符集。看[第 10 章，*字符集、排序规则、Unicode*](charset.html).

-   里面有一面旗帜`MyISAM`指示表是否正确关闭的索引文件。如果[**mysqld**](mysqld.html)开始于[`myisam_recover_options`](server-system-variables.html#sysvar_myisam_recover_options)系统变量集，`MyISAM`打开时会自动检查表，如果表未正确关闭，则会进行修复。

-   [**迈萨姆奇克**](myisamchk.html)如果您使用[`--更新状态`](myisamchk-check-options.html#option_myisamchk_update-state)选项。[**myisamchk --fast**](myisamchk.html)只检查那些没有这个标记的表。

-   [**myisamchk——分析**](myisamchk.html)存储部分键的统计信息，以及整个键的统计信息。

-   [**myisampack**](myisampack.html)可以打包[`斑点`](blob.html)和[`VARCHAR`](char.html)列。

`MyISAM`还支持以下功能：

-   支持真实的[`VARCHAR`](char.html)类型;一种[`VARCHAR`](char.html)列以存储在一个或两个字节中的长度开始。

-   表与[`VARCHAR`](char.html)列可能具有固定或动态的行长度。

-   长度的总和[`VARCHAR`](char.html)和[`字符`](char.html)表中的列最多可达 64KB。

-   任意长度`独特`约束。

### 其他资源

-   一个专门的论坛`MyISAM`存储引擎可在<https://forums.mysql.com/list.php?21>.
