存储引擎:MyISAM
跳到导航
跳到搜索
关于 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 以指示文件类型:
- “.frm”文件:存储表格式;
- “.MYD”(MYData)文件:数据文件;
- “.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”约束。