ITPub博客

首页 > 数据库 > > 15.2 MyISAM 存储引擎

15.2 MyISAM 存储引擎

作者:飘絮絮絮丶 时间:2020-05-11 14:17:18 0 删除 编辑

参考官方文档:
dev.mysql.com/doc/refma




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




不支持外键,不支持事务


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


要明确指定您需要MyISAM表,请使用ENGINE表选项指示:


CREATE TABLE t (i INT) ENGINE = MYISAM;




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


您可以使用mysqlcheck客户端或myisamchk实用程序检查或修复MyISAM表。 您还可以使用myisampack压缩MyISAM表以占用更少的空间。 请参见第4.5.3节“mysqlcheck - 表维护程序”,第4.6.3节“myisamchk - MyISAM表维护实用程序”和第4.6.5节“myisampack - 生成压缩,只读MyISAM表”。


MyISAM表具有以下特征:


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



首先存储低字节数据没有明显的速度损失; 表行中的字节通常是未对齐的,并且按顺序读取未对齐字节所需的处理比按相反顺序处理要少得多。 此外,与其他代码相比,服务器中获取列值的代码的时间不是关键。


  • 所有数字键值首先以高字节一起存储,以允许更好的索引压缩。
  • 支持大文件的文件系统和操作系统支持大文件(最大63位文件长度)。
  • MyISAM表中有(2**32)2(1.844E + 19)行的限制。
  • 每个MyISAM表的最大索引数为64。



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


  • 最大key长度为1000个字节。 这也可以通过更改源和重新编译来进行变更。 对于长度大于250字节的key的情况,会使用比默认值1024 字节更大的key 块大小。



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



  • 支持每个表对一个AUTO_INCREMENT列的内部处理。 MyISAM自动更新此列以进行INSERT和UPDATE操作。这使得AUTO_INCREMENT列更快(至少10%)。在被删除后,序列顶部的值不会重复使用。 (当AUTO_INCREMENT列被定义为多列索引的最后一列时,会重复使用从序列顶部删除的值。)可以使用ALTER TABLE或myisamchk重置AUTO_INCREMENT值。



  • 删除与更新和插入混合时,动态大小的行的碎片要小得多。这是通过自动组合相邻的已删除块并通过扩展块(如果下一个块被删除)来完成的。



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



  • 您可以将数据文件和索引文件放在不同的物理设备上的不同目录中,以便使用DATA DIRECTORY和INDEX DIRECTORY表选项更快地创建表。请参见第13.1.18节“CREATE TABLE语法”。



  • 可以索引BLOB和TEXT列。


  • 索引列中允许使用NULL值。每个key需要0到1个字节。



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



  • MyISAM索引文件中有一个标志,指示表是否已正确关闭。如果使用--myisam-recover-options选项启动mysqld,则会在打开时自动检查MyISAM表,如果表未正确关闭则会修复它。


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


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


  • myisampack可以pack BLOB和VARCHAR列。



MyISAM还支持以下功能:

  • 支持真正的VARCHAR类型; VARCHAR列以一个或两个字节存储的长度开头。
  • 具有VARCHAR列的表可以具有固定或动态行长度。
  • 表中VARCHAR和CHAR列的长度总和可能高达64KB。
  • 任意长度UNIQUE约束。



其他资源


有关MyISAM存储引擎的论坛可在forums.mysql.com/list.p上找到。




MyISAM表使用B树索引。 您可以粗略地计算索引文件的大小为(key_length + 4)/0.67,对所有键求和。 当所有键按排序顺序插入并且表没有任何压缩键时是最糟糕的情况。


字符串索引是空间压缩的。 如果第一个索引部分是字符串,则它也是前缀压缩的。 如果字符串列具有大量尾随空格或者不是总是用于全长的VARCHAR列,则空间压缩会使索引文件小于最坏情况。 前缀压缩用于以字符串开头的键。 如果有许多字符串具有相同的前缀,则前缀压缩会有所帮助。


在MyISAM表中,您还可以在创建表时通过指定PACK_KEYS = 1表选项为压缩数字前缀。 数字首先以高字节存储,因此当您有许多具有相同前缀的整数键时,这会有所帮助。



15.2.4 MyISAM 表问题


MySQL用于存储数据的文件格式已经过广泛测试,但始终存在可能导致数据库表损坏的情况。 以下讨论描述了这种情况如何发生以及如何处理。



15.2.4.1 被损坏的 MYISAM 表


即使MyISAM表格式非常可靠(在语句返回之前写入由SQL语句对表的所有更改),如果发生以下任何事件,您仍然可以获得损坏的表:


  • mysqld进程在写入过程中被终止。
  • 发生意外的计算机关闭(例如,计算机已关闭)。
  • 硬件故障。
  • 您正在使用外部程序(例如myisamchk)来修改服务器同时修改的表。
  • MySQL或MyISAM代码中的软件错误。



损坏表的典型症状是:

  • 从表中选择数据时出现以下错误:
    Incorrect key file for table: '...'. Try to repair it
  • 查询在表中找不到行或返回不完整的结果。


您可以使用CHECK TABLE语句检查MyISAM表的运行状况,并使用REPAIR TABLE修复损坏的MyISAM表。 当mysqld未运行时,您还可以使用myisamchk命令检查或修复表。

如果您的表经常损坏,您应该尝试确定为什么会发生这种情况。 最重要的是要知道表是否因服务器崩溃而损坏。 您可以通过在错误日志中查找最近重新启动的mysqld消息来轻松验证这一点。 如果存在这样的消息,则表损坏很可能是服务器死亡的结果。 否则,在正常操作期间可能发生损坏, 这是一个错误。 您应该尝试创建一个可重现的测试用例来演示该问题。


15.2.4.2 表未正确关闭中的问题


每个MyISAM索引文件(.MYI文件)在标头中都有一个计数器,可用于检查表是否已正确关闭。 如果从CHECK TABLE或myisamchk收到以下警告,则表示此计数器已不同步:

clients are using or haven't closed the table properly

此警告并不一定意味着表已损坏,但您至少应检查该表。

该计数器的工作原理如下:

  • 第一次在MySQL中更新表时,索引文件头中的计数器会递增。
  • 在进一步更新期间,计数器不会更改。
  • 当表的最后一个实例关闭时(因为执行了FLUSH TABLES操作或因为表缓存中没有空间),如果表已在任何时候更新,则计数器会递减。
  • 当您修复表格或检查表格并且发现它没有问题时,计数器将重置为零。
  • 为了避免与可能检查表的其他进程交互的问题,如果计数器为零,则计数器不会在关闭时递减。



换句话说,只有在以下条件下,计数器才会变得不正确:

  • 复制MyISAM表而不先发出LOCK TABLES和FLUSH TABLES。
  • MySQL在更新和最后关闭之间崩溃了。 (该表可能仍然是好的,因为MySQL总是在每个语句之间发出所有内容的写入。)
  • 一个表用过--recover或myisamchk --update-state 被修改,在相同时刻它被mysqld使用。
  • 多个mysqld服务器正在使用该表,并且一个服务器在其他服务器正在使用时在表上执行了REPAIR TABLE或CHECK TABLE。 在此设置中,使用CHECK TABLE是安全的,尽管您可能会收到来自其他服务器的警告。 但是,应该避免使用REPAIR TABLE,因为当一个服务器用新服务器替换数据文件时,其他服务器不知道这一点。


通常,在多个服务器之间共享数据目录是个坏主意。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3143523/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42264