MyISAM 基于较旧的(并且不再可用)ISAM 存储引擎,但有许多有用的扩展。
表 18.2 MyISAM 存储引擎功能
| 功能 | 支持 | 
|---|---|
| B 树索引 | 是 | 
| 备份/时间点恢复(在服务器中实现,而不是在存储引擎中实现。) | 是 | 
| 集群数据库支持 | 否 | 
| 聚簇索引 | 否 | 
| 压缩数据 | 是(仅在使用压缩行格式时才支持压缩 MyISAM 表。使用 MyISAM 压缩行格式的表为只读。) | 
| 数据缓存 | 否 | 
| 加密数据 | 是(通过加密函数在服务器中实现。) | 
| 外键支持 | 否 | 
| 全文搜索索引 | 是 | 
| 地理空间数据类型支持 | 是 | 
| 地理空间索引支持 | 是 | 
| 哈希索引 | 否 | 
| 索引缓存 | 是 | 
| 锁定粒度 | 表 | 
| MVCC | 否 | 
| 复制支持(在服务器中实现,而不是在存储引擎中实现。) | 是 | 
| 存储限制 | 256TB | 
| T 树索引 | 否 | 
| 事务 | 否 | 
| 更新数据字典的统计信息 | 是 | 
每个 MyISAM 表都存储在磁盘上的两个文件中。这些文件的名称以表名开头,并带有一个扩展名来表示文件类型。数据文件的扩展名为 .MYD(MYData)。索引文件的扩展名为 .MYI(MYIndex)。表定义存储在 MySQL 数据字典中。
要显式指定要使用 MyISAM 表,请使用 ENGINE 表选项来指示
CREATE TABLE t (i INT) ENGINE = MYISAM;在 MySQL 9.0 中,通常需要使用 ENGINE 来指定 MyISAM 存储引擎,因为 InnoDB 是默认引擎。
您可以使用 mysqlcheck 客户端或 myisamchk 实用程序来检查或修复 MyISAM 表。您还可以使用 myisampack 压缩 MyISAM 表,以占用更少的空间。请参阅 第 6.5.3 节 “mysqlcheck — 表维护程序”、第 6.6.4 节 “myisamchk — MyISAM 表维护实用程序” 和 第 6.6.6 节 “myisampack — 生成压缩的、只读的 MyISAM 表”。
在 MySQL 9.0 中,MyISAM 存储引擎不支持分区。 在早期版本的 MySQL 中创建的分区 MyISAM 表不能在 MySQL 9.0 中使用。有关更多信息,请参阅 第 26.6.2 节 “与存储引擎相关的分区限制”。有关升级此类表以便它们可以在 MySQL 9.0 中使用的帮助,请参阅 第 3.5 节 “MySQL 9.0 中的更改”。
    MyISAM 表具有以下特征:
- 所有数据值都以低位字节优先存储。这使得数据独立于机器和操作系统。二进制可移植性的唯一要求是机器使用二进制补码有符号整数和 IEEE 浮点格式。这些要求在主流机器中得到广泛使用。二进制兼容性可能不适用于嵌入式系统,因为它们有时具有特殊的处理器。 - 以低位字节优先存储数据不会造成明显的性能损失;表行中的字节通常是不对齐的,并且按顺序读取未对齐的字节与按相反顺序读取未对齐的字节相比,只需稍微多一点处理时间。此外,与其他代码相比,服务器中获取列值的代码对时间的要求并不高。 
- 所有数字键值都以高位字节优先存储,以便更好地压缩索引。 
- 支持大型文件(文件长度高达 63 位)的文件系统和操作系统支持大型文件。 
- MyISAM表中的行数限制为 (232)2 (1.844E+19)。
- 每个 - MyISAM表的最大索引数为 64。- 每个索引的最大列数为 16。 
- 最大键长度为 1000 字节。这也可以通过更改源代码并重新编译来更改。对于长度超过 250 字节的键,将使用大于默认值 1024 字节的键块大小。 
- 当按排序顺序插入行时(例如,当您使用 - AUTO_INCREMENT列时),索引树将被拆分,以便高节点仅包含一个键。这提高了索引树的空间利用率。
- 支持对每个表中的一列 - AUTO_INCREMENT进行内部处理。- MyISAM会针对- INSERT和- UPDATE操作自动更新此列。这使得- AUTO_INCREMENT列更快(至少快 10%)。删除后,序列顶部的值不会被重复使用。(当- AUTO_INCREMENT列被定义为多列索引的最后一列时,确实会重复使用从序列顶部删除的值。)可以使用- ALTER TABLE或 myisamchk 重置- AUTO_INCREMENT值。
- 当将删除与更新和插入混合时,动态大小的行碎片会少得多。这是通过自动组合相邻的已删除块以及在删除下一个块时扩展块来实现的。 
- MyISAM支持并发插入:如果表的数据文件中间没有空闲块,则可以在其他线程从表中读取数据的同时,向其中- INSERT新行。删除行或更新动态长度行时,如果其数据多于当前内容,则可能会出现空闲块。当所有空闲块都被用完(填满)时,以后的插入将再次变得并发。请参阅 第 10.11.3 节 “并发插入”。
- 您可以使用 - DATA DIRECTORY和- INDEX DIRECTORY表选项将数据文件和索引文件放在不同物理设备上的不同目录中,以提高- CREATE TABLE的速度。请参阅 第 15.1.20 节 “CREATE TABLE 语句”。
- 在索引列中允许使用 - NULL值。每个键需要 0 到 1 个字节。
- 每个字符列都可以有不同的字符集。请参阅 第 12 章,字符集、排序规则、Unicode。 
- MyISAM索引文件中有一个标志,用于指示表是否已正确关闭。如果使用- myisam_recover_options系统变量启动 mysqld,则会在打开- MyISAM表时自动检查它们,如果表未正确关闭,则会对其进行修复。
- 如果您使用 - --update-state选项运行 myisamchk,它会将表标记为已检查。 myisamchk --fast 仅检查没有此标记的表。
- myisamchk --analyze 存储部分键以及整个键的统计信息。 
- myisampack 可以打包 - BLOB和- VARCHAR列。
    MyISAM 还支持以下功能
其他资源
- 有关 - MyISAM存储引擎的论坛,请访问 https://forums.mysql.com/list.php?21。