15.2 MyISAM 存储引擎

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

table15.2 MyISAM 存储引擎功能

FeatureSupport
B-tree indexesYes
备份/时间点恢复 (在服务器中而不是在存储引擎中实现.)Yes
集群数据库支持No
Clustered indexesNo
Compressed data是(仅当使用压缩行格式时才支持压缩 MyISAMtable.将压缩行格式与 MyISAM 一起使用的 table 是只读的.)
Data cachesNo
Encrypted data是(通过加密功能在服务器中实现.)
外键支持No
全文搜索索引Yes
地理空间数据类型支持Yes
地理空间索引支持Yes
Hash indexesNo
Index cachesYes
Locking granularityTable
MVCCNo
复制支持 (在服务器中而不是在存储引擎中实现.)Yes
Storage limits256TB
T-tree indexesNo
TransactionsNo
更新数据字典的统计信息Yes

每个MyISAMtable 都以三个文件存储在磁盘上。这些文件的名称以 table 名开头,并具有 extensions 以指示文件类型。 .frm文件存储 table 格式。数据文件具有.MYD(MYData)extensions。索引文件具有.MYI(MYIndex)extensions。

要明确指定您想要MyISAMtable,请使用ENGINEtable 选项进行指示:

CREATE TABLE t (i INT) ENGINE = MYISAM;

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

您可以使用mysqlcheckClient 端或myisamchkUtil 检查或修复MyISAMtable。您还可以使用myisampack压缩MyISAMtable 以减少占用的空间。参见第 4.5.3 节“ mysqlcheck-table 维护程序”第 4.6.3 节“ myisamchk-MyISAMtable 维护 Util”第 4.6.5 节“ myisampack —生成压缩的只读 MyISAMtable”

MyISAMtable 具有以下 Feature:

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

先存储低字节数据没有明显的速度损失;table 行中的字节通常是未对齐的,因此按 Sequences 读取未对齐的字节要比按相反的 Sequences 花费更多的处理。而且,与其他代码相比,服务器中获取列值的代码不是时间紧迫的。

  • 所有数字键值都先存储高字节,以实现更好的索引压缩。

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

  • MyISAMtable 中的(232)2(1.844E 19)行的限制。

  • 每个MyISAMtable 的最大索引数为 64.

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

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

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

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

  • 当将删除与更新和插入混合在一起时,动态大小的行的碎片化要少得多。通过自动组合相邻的已删除块并通过扩展块(如果删除下一个块)来完成此操作。

  • MyISAM支持并发插入:如果 table 在数据文件的中间没有空闲块,则可以在其他线程从 table 中读取数据的同时INSERT向其中插入新行。由于删除行或使用比当前内容多的数据更新动态长度行,可能导致出现空闲块。当所有可用块用完(填充)时,以后的插入将再次并发。参见第 8.11.3 节“并发插入”

  • 您可以将数据文件和索引文件放在不同物理设备上的不同目录中,以CREATE TABLEDATA DIRECTORYINDEX DIRECTORYtable 选项获得更快的速度。参见第 13.1.18 节“ CREATE TABLE 语句”

  • 可以为BLOBTEXT列构建索引。

  • 索引列中允许NULL个值。每个密钥占用 0 到 1 个字节。

  • 每个字符列可以具有不同的字符集。参见第 10 章,字符集,排序规则,Unicode

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

  • 如果您使用--update-state选项运行 table,则myisamchk将 table 标记为已选中。 myisamchk --fast仅检查那些没有此标记的 table。

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

  • myisampack可以打包BLOBVARCHAR列。

MyISAM还支持以下功能:

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

  • 具有VARCHAR列的 table 可能具有固定或动态的行长。

  • 一个 table 中的VARCHARCHAR列的长度总和最多为 64KB。

  • 任意长度UNIQUE约束。

Additional Resources