MyISAM 是基于旧的(且不再可用)ISAM 存储引擎,但具有许多有用的扩展。
表 18.2 MyISAM 存储引擎特性
| Feature | Support |
|---|---|
| B 树索引 | 是 |
| 备份/点时间恢复 (在服务器中实现,而不是在存储引擎中。) | 是 |
| 集群数据库支持 | 否 |
| 集群索引 | 否 |
| 压缩数据 | 是 (压缩的 MyISAM 表仅在使用压缩行格式时支持。使用压缩行格式的 MyISAM 表是只读的。) |
| 数据缓存 | 否 |
| 加密数据 | 是 (在服务器中通过加密函数实现。) |
| 外键支持 | 否 |
| 全文搜索索引 | 是 |
| 地理空间数据类型支持 | 是 |
| 地理空间索引支持 | 是 |
| 哈希索引 | 否 |
| 索引缓存 | 是 |
| 锁粒度 | 表 |
| MVCC | 否 |
| 复制支持 (在服务器中实现,而不是在存储引擎中。) | 是 |
| 存储限制 | 256TB |
| T 树索引 | 否 |
| 事务 | 否 |
| 更新统计信息 | 是 |
每个 MyISAM 表都存储在磁盘上两个文件中。文件的名称以表名开头,并以扩展名指示文件类型。数据文件具有 .MYD (MYData) 扩展名。索引文件具有 .MYI (MYIndex) 扩展名。表定义存储在 MySQL 数据字典中。
要明确指定要使用 MyISAM 表,请使用 ENGINE 表选项:
CREATE TABLE t (i INT) ENGINE = MYISAM;
在 MySQL 8.3 中,通常需要使用 ENGINE 指定 MyISAM 存储引擎,因为 InnoDB 是默认引擎。
您可以使用 mysqlcheck 客户端或 mysqlcheck 实用程序检查或修复 MyISAM 表。您也可以使用 myisampack 将 MyISAM 表压缩以节省大量空间。请参阅 第 6.5.3 节,“mysqlcheck — 表维护程序”、第 6.6.4 节,“myisamchk — MyISAM 表维护实用程序” 和 第 6.6.6 节,“myisampack — 生成压缩的、只读的 MyISAM 表”。
在 MySQL 8.3 中,MyISAM 存储引擎不支持分区。 在之前的 MySQL 版本中创建的分区 MyISAM 表不能在 MySQL 8.3 中使用。有关更多信息,请参阅 第 26.6.2 节,“与存储引擎相关的分区限制”。要升级这些表以便在 MySQL 8.3 中使用,请参阅 第 3.5 节,“MySQL 8.3 中的变化”。
MyISAM 表具有以下特征:
-
所有数据值都以低字节先存储。这使得数据机器和操作系统独立。唯一的要求是机器使用二进制补码 signed 整数和 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索引文件中,有一个标志指示表是否正确关闭。如果使用 mysqld 启动时设置了myisam_recover_options系统变量,MyISAM表将在打开时自动检查,并在必要时进行修复。 -
myisamchk 如果您使用
--update-state选项运行它,将标记表为已检查的。myisamchk --fast 只检查那些没有标记的表。 -
myisamchk --analyze 存储键的部分统计信息,以及整个键的统计信息。
-
myisampack 可以压缩
BLOB和VARCHAR列。
MyISAM 还支持以下功能:
附加资源
-
有一个专门的
MyISAM存储引擎论坛可供使用,位于 https://forums.mysql.com/list.php?21。