相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  可选存储引擎  /  MyISAM 存储引擎

18.2 MyISAM 存储引擎

MyISAM 基于较旧的(并且不再可用)ISAM 存储引擎,但有许多有用的扩展。

表 18.2 MyISAM 存储引擎特性

特性 支持
B 树索引
**备份/时间点恢复**(在服务器中实现,而不是在存储引擎中实现。)
集群数据库支持
聚簇索引
压缩数据 是(仅当使用压缩行格式时才支持压缩 MyISAM 表。使用 MyISAM 压缩行格式的表为只读。)
数据缓存
加密数据 是(通过加密函数在服务器中实现。)
外键支持
全文搜索索引
地理空间数据类型支持
地理空间索引支持
哈希索引
索引缓存
锁定粒度
MVCC
**复制支持**(在服务器中实现,而不是在存储引擎中实现。)
存储限制 256TB
T 树索引
事务
更新数据字典的统计信息

每个 MyISAM 表都存储在磁盘上的两个文件中。文件名的开头是表名,并带有一个扩展名以指示文件类型。数据文件的扩展名为 .MYDMYData)。索引文件的扩展名为 .MYIMYIndex)。表定义存储在 MySQL 数据字典中。

要明确指定您想要一个 MyISAM 表,请使用 ENGINE 表选项来指示

CREATE TABLE t (i INT) ENGINE = MYISAM;

在 MySQL 8.4 中,通常需要使用 ENGINE 来指定 MyISAM 存储引擎,因为 InnoDB 是默认引擎。

您可以使用 mysqlcheck 客户端或 myisamchk 实用程序来检查或修复 MyISAM 表。您还可以使用 myisampack 压缩 MyISAM 表,以占用更少的空间。请参阅 第 6.5.3 节,“mysqlcheck — 表维护程序”第 6.6.4 节,“myisamchk — MyISAM 表维护实用程序”第 6.6.6 节,“myisampack — 生成压缩的只读 MyISAM 表”

在 MySQL 8.4 中,MyISAM 存储引擎不提供分区支持。在以前版本的 MySQL 中创建的分区 MyISAM 表无法在 MySQL 8.4 中使用。有关更多信息,请参阅 第 26.6.2 节,“与存储引擎相关的分区限制”。有关如何升级此类表以便它们可以在 MySQL 8.4 中使用的帮助,请参阅 第 3.5 节,“MySQL 8.4 中的更改”

MyISAM 表具有以下特征:

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

    以低位字节优先存储数据不会造成明显的性能损失;表行中的字节通常是不对齐的,按顺序读取不对齐的字节与按相反顺序读取不对齐的字节相比,只需稍多一点处理时间。此外,与其他代码相比,服务器中获取列值的代码不是时间关键型的。

  • 所有数字键值都以高位字节优先存储,以便更好地进行索引压缩。

  • 在支持大文件的文件系统和操作系统上支持大文件(最大 63 位文件长度)。

  • MyISAM 表中的行数限制为 (232)2 (1.844E+19)。

  • 每个 MyISAM 表的最大索引数为 64。

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

  • 最大键长度为 1000 字节。这也可以通过更改源代码并重新编译来更改。对于长度超过 250 字节的键,将使用大于默认值 1024 字节的较大键块大小。

  • 当按排序顺序插入行时(例如,当您使用 AUTO_INCREMENT 列时),索引树将被拆分,以便高节点只包含一个键。这提高了索引树中的空间利用率。

  • 支持对每个表中的一列 AUTO_INCREMENT 进行内部处理。MyISAM 会自动为 INSERTUPDATE 操作更新此列。这使得 AUTO_INCREMENT 列更快(至少快 10%)。序列顶部的值在删除后不会被重用。(当将 AUTO_INCREMENT 列定义为多列索引的最后一列时,会发生对从序列顶部删除的值的重用。)可以使用 ALTER TABLEmyisamchk 重置 AUTO_INCREMENT 值。

  • 当将删除与更新和插入混合时,动态大小的行碎片化程度要低得多。这是通过自动组合相邻的已删除块以及在下一个块被删除时扩展块来实现的。

  • MyISAM 支持并发插入:如果一个表的数据文件中间没有空闲块,则可以在其他线程从该表读取数据的同时,将新行 INSERT 到该表中。删除行或更新动态长度行(其数据多于当前内容)可能会产生空闲块。当所有空闲块都被用完(填满)时,以后的插入将再次变为并发插入。请参阅 第 10.11.3 节,“并发插入”

  • 您可以使用 DATA DIRECTORYINDEX DIRECTORY 表选项将数据文件和索引文件放在不同物理设备的不同目录中,以提高 CREATE TABLE 的速度。请参阅 第 15.1.20 节,“CREATE TABLE 语句”

  • BLOBTEXT 列可以被索引。

  • 在索引列中允许使用 NULL 值。每个键需要 0 到 1 个字节。

  • 每个字符列都可以有不同的字符集。请参阅 第 12 章,字符集、排序规则、Unicode

  • MyISAM 索引文件中有一个标志,指示表是否已正确关闭。如果在设置了 myisam_recover_options 系统变量的情况下启动 mysqld,则会在打开 MyISAM 表时自动检查它们,如果表未正确关闭,则会对其进行修复。

  • 如果您使用 --update-state 选项运行 myisamchk,它会将表标记为已检查。 myisamchk --fast 只检查那些没有此标记的表。

  • myisamchk --analyze 会存储部分键以及整个键的统计信息。

  • myisampack 可以压缩 BLOBVARCHAR 列。

MyISAM 还支持以下功能:

  • 支持真正的 VARCHAR 类型;VARCHAR 列以存储在一个或两个字节中的长度开头。

  • 具有 VARCHAR 列的表可以具有固定或动态的行长度。

  • 表中 VARCHARCHAR 列的长度总和最多可以为 64KB。

  • 任意长度的 UNIQUE 约束。

其他资源