18.2 MyISAM 存储引擎
MyISAM
基于更早的(且不再可用的)ISAM
存储引擎,但具有许多有用的扩展。
Table 18.2 MyISAM Storage Engine Features
Feature | Support |
---|---|
B-tree indexes | 是 |
Backup/point-in-time recovery(在服务器中实现,而不是在存储引擎中。) | 是 |
Cluster database support | 否 |
Clustered indexes | 否 |
Compressed data | 是(压缩MyISAM表只支持使用压缩行格式。使用MyISAM的压缩行格式表为只读。) |
数据缓存 | 否 |
加密数据 | 是(在服务器中实现了加密函数。) |
外键支持 | 否 |
全文搜索索引 | 是 |
地理空间数据类型支持 | 是 |
地理空间索引支持 | 是 |
哈希索引 | 否 |
索引缓存 | 是 |
锁定粒度 | 表 |
MVCC | 否 |
复制支持(在服务器中实现了,而不是在存储引擎中。) | 是 |
存储限制 | 256TB |
T-树索引 | 否 |
事务 | 否 |
更新数据字典统计信息 | 是 |
每个 MyISAM
表在磁盘上存储在两个文件中。这些文件的名称以表名开头,并且有一个扩展名来表示文件类型。数据文件具有.MYD
(MYData
)扩展名,而索引文件具有.MYI
(MYIndex
)扩展名。表定义存储在 MySQL 数据字典中。
要明确地指定您想要使用 MyISAM
表,使用 ENGINE
表选项:
CREATE TABLE t (i INT) ENGINE = MYISAM;
在 MySQL 8.4 中,因为 InnoDB
是默认引擎,所以通常需要使用 ENGINE
指定 MyISAM
存储引擎。
您可以使用 mysqlcheck 客户端或 myisamchk 工具来检查或修复 MyISAM
表。您还可以使用 myisampack 将 MyISAM
表压缩到占用空间很小。请参阅第6.5.3节,“mysqlcheck — A Table Maintenance Program”、第6.6.4节,“myisamchk — MyISAM Table-Maintenance Utility”和第6.6.6节,“myisampack — Generate Compressed, Read-Only MyISAM Tables”。
在 MySQL 8.4 中,MyISAM
存储引擎不提供分区支持。在之前的 MySQL 版本中创建的分区 MyISAM
表不能在 MySQL 8.4 中使用。更多信息,请参阅第26.6.2节,“Partitioning Limitations Relating to Storage Engines”。要帮助升级这些表,以便在 MySQL 8.4 中使用,请参阅第3.5节,“Changes in MySQL 8.4”。
MyISAM
表具有以下特点:
-
所有数据值都以低字节首先存储。这使得数据机器和操作系统独立。唯一的二进制兼容性要求是机器使用有符号整数补码和IEEE浮点格式。这两个要求在主流机器中广泛使用。对嵌入式系统可能不适用,因为它们 sometime 使用奇特处理器。
存储数据低字节首先没有明显的速度 penalty;表行中的字节通常是未对齐的,读取未对齐字节顺序与反顺序需要很少更多的处理时间。服务器中获取列值的代码也不是相比其他代码而言时间敏感的。
-
所有数字键值都以高字节首先存储,以便更好地压缩索引。
-
支持大文件(最长63位文件长度),在支持大文件的文件系统和操作系统上运行。
-
MyISAM
表中的行数限制为(232)2(1.844E+19)。 -
每个
MyISAM
表的索引数量限制为64。每个索引中的列数限制为16。
-
键的最大长度为1000字节。这也可以通过更改源代码并重新编译来改变。在键长超过250字节的情况下,使用默认1024字节的键块大小。
-
当插入排序后的行(例如,当使用
AUTO_INCREMENT
列时),索引树将被分割,以便高节点只包含一个键。这改善了索引树中的空间 utilization。 -
支持每个表中的一个
AUTO_INCREMENT
列的内部处理。MyISAM
自动更新该列以响应INSERT
和UPDATE
操作,这使得AUTO_INCREMENT
列速度更快(至少10%)。序列的顶部值不会在被删除后重新使用。(当一个AUTO_INCREMENT
列作为多列索引的最后一列时,删除序列的顶部值的重用确实会发生。)可以使用ALTER TABLE
或myisamchk来重置AUTO_INCREMENT
值。 -
在混合删除、更新和插入操作时,动态大小行的碎片化程度要小得多。这是通过自动组合相邻删除块和扩展块以便下一个块被删除来实现的。
-
MyISAM
支持并发插入:如果表中没有位于数据文件中的空块,可以同时在该表中INSERT
新行,同时其他线程正在读取该表。空块可以由于删除行或更新动态长度行的内容而出现。当所有空块都被使用完毕(填充)时,未来插入操作将再次变为并发。请参阅第10.11.3节,“并发插入”。 -
您可以将数据文件和索引文件放在不同的物理设备上,以提高速度,使用
DATA DIRECTORY
和INDEX DIRECTORY
表选项来CREATE TABLE
。请参阅第15.1.20节,“CREATE TABLE 语句”。 -
NULL
值在索引列中是允许的。这将占用0到1个字节每键。 -
每个字符列都可以具有不同的字符集。请参阅第12章,《字符集、collations、Unicode》。
-
在
MyISAM
索引文件中,有一个标志,指示表是否正确关闭。如果将mysqld 启动时设置了myisam_recover_options
系统变量,MyISAM
表将在打开时自动检查,如果表未正确关闭,则进行修复。 -
myisamchk 使用
--update-state
选项将表标记为已检查。myisamchk --fast 只检查没有标记的表。 -
myisamchk --analyze 存储键的部分统计信息,以及整个键的统计信息。
-
myisampack 可以压缩
BLOB
和VARCHAR
列。
MyISAM
还支持以下功能:
-
MyISAM存储引擎专门论坛可在https://forums.mysql.com/list.php?21找到。