存储引擎:MyISAM

来自Wikioe
跳到导航 跳到搜索


关于 MyISAM

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

  • MyISAM 表使用 B 树索引


MyISAM 存储引擎功能:

Feature Support
B-tree indexes Yes
备份/时间点恢复 (在服务器中而不是在存储引擎中实现.) Yes
集群数据库支持 No
Clustered indexes(聚集索引) No
Compressed data 是(仅当使用压缩行格式时才支持压缩 MyISAM 表。将压缩行格式与 MyISAM 一起使用的 table 是只读的)
Data caches No
Encrypted data 是(通过加密功能在服务器中实现)
外键支持 No
全文搜索索引 Yes
地理空间数据类型支持 Yes
地理空间索引支持 Yes
Hash indexes No
Index caches Yes
锁粒度 Table
MVCC(多版本并发控制) No
复制支持 (在服务器中而不是在存储引擎中实现.) Yes
Storage limits 256TB
T-tree indexes No
事务 No
更新数据字典的统计信息 Yes


每个 MyISAM 表都以三个文件存储在磁盘上。这些文件的名称以表名开头,并具有 extensions 以指示文件类型:

  1. .frm”文件:存储表格式;
  2. .MYD”(MYData)文件:数据文件;
  3. .MYI”(MYIndex)文件:索引文件。

要明确指定使用 MyISAM 表,请使用“ENGINE”表选项进行指示:

CREATE TABLE t (i INT ENGINE = MYISAM;
  • 在 MySQL 5.7 中,通常必须使用“ENGINE”来指定 MyISAM 存储引擎,因为 InnoDB 是默认引擎
  • 您可以使用“mysqlcheck”Client端或“myisamchk”工具检查或修复 MyISAM 表。您还可以使用“myisampack”压缩 MyISAM 表以减少占用的空间。


MyISAM 表具有以下 Feature:

  • 所有数据值都先以低字节存储。这使数据机和 os 独立。二进制可移植性的唯一要求是机器使用二进制补码有符号整数和 IEEE 浮点格式。这些要求已在主流机器中广泛使用。二进制兼容性可能不适用于有时具有特殊处理器的嵌入式系统。
    先存储低字节数据没有明显的速度损失;表行中的字节通常是未对齐的,因此按 Sequences 读取未对齐的字节要比按相反的 Sequences 花费更多的处理。而且,与其他代码相比,服务器中获取列值的代码不是时间紧迫的。

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

  • 在支持大文件的文件系统和 os 上,支持大文件(文件长度最大为 63 位)。
  • MyISAM 表中的(232)2(1.844E 19)行的限制。【???】
  • 每个 MyISAM 表的最大索引数为 64。
    每个索引的最大列数为 16。
  • 最大密钥长度为 1000 个字节。也可以通过更改源代码并重新编译来更改。对于密钥超过 250 字节的情况,将使用比默认值 1024 字节更大的密钥块大小。
  • 当按排序 Sequences 插入行时(如使用“AUTO_INCREMENT”列时),索引树将被拆分,以便高级节点仅包含一个键。这样可以提高索引树中的空间利用率。
  • 支持内部处理每个 table 一个“AUTO_INCREMENT”列。 MyISAM 自动针对“INSERT”和“UPDATE”操作更新此列。这使“AUTO_INCREMENT”列更快(至少 10%)。序列顶部的值在删除后不会重复使用。 (当“AUTO_INCREMENT”列定义为多列索引的最后一列时,确实会重复使用从序列顶部删除的值。)“AUTO_INCREMENT”值可以用“ALTER TABLE”或“myisamchk”重置。
  • 当将删除与更新和插入混合在一起时,动态大小的行的碎片化要少得多。通过自动组合相邻的已删除块并通过扩展块(如果删除下一个块)来完成此操作。
  • MyISAM 支持并发插入:如果 table 在数据文件的中间没有空闲块,则可以在其他线程从 table 中读取数据的同时 INSERT 向其中插入新行。由于删除行或使用比当前内容多的数据更新动态长度行,可能导致出现空闲块。当所有可用块用完(填充)时,以后的插入将再次并发。
  • 可以将数据文件和索引文件放在不同物理设备上的不同目录中,以“CREATE TABLE”的“DATA DIRECTORY”和“INDEX DIRECTORY”表选项获得更快的速度。【参见“ CREATE TABLE 语句”节】
  • 可以为“BLOB”和“TEXT”列构建索引
  • 索引列中允许 NULL 个值。每个密钥占用 0 到 1 个字节。
  • 每个字符列可以具有不同的字符集。
  • MyISAM 索引文件中有一个标志,指示 table 是否已正确关闭。如果 mysqld 以设置的“myisam_recover_options”系统变量启动,则 MyISAM 表在打开时会自动检查,如果未正确关闭 table,则会对其进行修复。
  • 如果您使用“--update-state”选项运行 table,则“myisamchk”将 table 标记为已选中。“myisamchk --fast”仅检查那些没有此标记的 table。
  • “myisamchk --analyze”存储部分键以及整个键的统计信息。
  • “myisampack”可以打包“BLOB”和“VARCHAR”列。


MyISAM 还支持以下功能:

  • 支持 true 的“VARCHAR”类型;“VARCHAR”列以存储在一个或两个字节中的长度开始。
  • 具有“VARCHAR”列的 table 可能具有固定或动态的行长。
  • 一个 table 中的“VARCHAR”和“CHAR”列的长度总和最多为 64KB。
  • 支持任意长度的“UNIQUE”约束。

MyISAM 启动选项

键值所需的空间

MyISAM 表存储格式

MyISAM 表问题