15.2 MyISAM 存储引擎
MyISAM
基于较旧(且不再可用)的ISAM
存储引擎,但具有许多有用的扩展。
table15.2 MyISAM 存储引擎功能
Feature | Support |
---|---|
B-tree indexes | Yes |
备份/时间点恢复 (在服务器中而不是在存储引擎中实现.) | Yes |
集群数据库支持 | No |
Clustered indexes | No |
Compressed data | 是(仅当使用压缩行格式时才支持压缩 MyISAMtable.将压缩行格式与 MyISAM 一起使用的 table 是只读的.) |
Data caches | No |
Encrypted data | 是(通过加密功能在服务器中实现.) |
外键支持 | No |
全文搜索索引 | Yes |
地理空间数据类型支持 | Yes |
地理空间索引支持 | Yes |
Hash indexes | No |
Index caches | Yes |
Locking granularity | Table |
MVCC | No |
复制支持 (在服务器中而不是在存储引擎中实现.) | Yes |
Storage limits | 256TB |
T-tree indexes | No |
Transactions | No |
更新数据字典的统计信息 | Yes |
每个MyISAM
table 都以三个文件存储在磁盘上。这些文件的名称以 table 名开头,并具有 extensions 以指示文件类型。 .frm
文件存储 table 格式。数据文件具有.MYD
(MYData
)extensions。索引文件具有.MYI
(MYIndex
)extensions。
要明确指定您想要MyISAM
table,请使用ENGINE
table 选项进行指示:
CREATE TABLE t (i INT) ENGINE = MYISAM;
在 MySQL 5.7 中,通常必须使用ENGINE
来指定MyISAM
存储引擎,因为InnoDB
是默认引擎。
您可以使用mysqlcheckClient 端或myisamchkUtil 检查或修复MyISAM
table。您还可以使用myisampack压缩MyISAM
table 以减少占用的空间。参见第 4.5.3 节“ mysqlcheck-table 维护程序”,第 4.6.3 节“ myisamchk-MyISAMtable 维护 Util”和第 4.6.5 节“ myisampack —生成压缩的只读 MyISAMtable”。
MyISAM
table 具有以下 Feature:
- 所有数据值都先以低字节存储。这使数据机和 os 独立。二进制可移植性的唯一要求是机器使用二进制补码有符号整数和 IEEE 浮点格式。这些要求已在主流机器中广泛使用。二进制兼容性可能不适用于有时具有特殊处理器的嵌入式系统。
先存储低字节数据没有明显的速度损失;table 行中的字节通常是未对齐的,因此按 Sequences 读取未对齐的字节要比按相反的 Sequences 花费更多的处理。而且,与其他代码相比,服务器中获取列值的代码不是时间紧迫的。
-
所有数字键值都先存储高字节,以实现更好的索引压缩。
-
在支持大文件的文件系统和 os 上,支持大文件(文件长度最大为 63 位)。
-
MyISAM
table 中的(232)2(1.844E 19)行的限制。 -
每个
MyISAM
table 的最大索引数为 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向其中插入新行。由于删除行或使用比当前内容多的数据更新动态长度行,可能导致出现空闲块。当所有可用块用完(填充)时,以后的插入将再次并发。参见第 8.11.3 节“并发插入”。 -
您可以将数据文件和索引文件放在不同物理设备上的不同目录中,以CREATE TABLE的
DATA DIRECTORY
和INDEX DIRECTORY
table 选项获得更快的速度。参见第 13.1.18 节“ CREATE TABLE 语句”。 -
索引列中允许
NULL
个值。每个密钥占用 0 到 1 个字节。 -
每个字符列可以具有不同的字符集。参见第 10 章,字符集,排序规则,Unicode。
-
MyISAM
索引文件中有一个标志,指示 table 是否已正确关闭。如果mysqld以设置的myisam_recover_options系统变量启动,则MyISAM
table 在打开时会自动检查,如果未正确关闭 table,则会对其进行修复。 -
如果您使用--update-state选项运行 table,则myisamchk将 table 标记为已选中。 myisamchk --fast仅检查那些没有此标记的 table。
-
myisamchk --analyze存储部分键以及整个键的统计信息。
-
myisampack可以打包BLOB和VARCHAR列。
MyISAM
还支持以下功能:
-
具有VARCHAR列的 table 可能具有固定或动态的行长。
-
任意长度
UNIQUE
约束。
Additional Resources
- https://forums.mysql.com/list.php?21提供了一个专门讨论
MyISAM
存储引擎的论坛。