了解MyISAM记录结构

时间:2013-05-23 10:49:44

标签: mysql database architecture myisam

我试图理解MyISAM如何实际存储其记录以及在记录插入和记录删除后如何维护其结构。我已阅读以下链接:

我想确定我是否理解正确,如果不对,请纠正我。

固定大小的记录

MyISAM fixed-size record

  • 删除标记确定是删除还是删除记录。
  • 记录标题保存行的哪一列包含NULL值
  • 数据长度是固定的。

可变大小的记录

enter image description here

  • 删除标记替换为BLOCK_DELETED块类型
  • 记录标题包含数据长度和未使用数据的长度

enter image description here

  • 单个记录可以分隔成由溢出指针连接的多个块。

删除

enter image description here

  • 对于可变大小的记录,请将块类型更改为BLOCK_DELETED
  • 通过将新删除的记录的先前指针指向上次删除的记录来维护所有已删除记录的双链表。然后,最后删除的记录的下一个指针指向新删除的记录。
  • 对于固定大小的记录,只需将删除标记更改为已删除。 (不确定他们是否使用双链表将所有已删除的记录与固定大小的记录连接起来)

插入

  • 如果没有未使用的空间(已删除的记录),请将数据附加到文件的末尾
  • 如果有未使用的空间适合新插入的记录,请在那里写下新记录。
  • 如果有未使用的空间远远大于新插入的记录,则拆分为两个记录:新记录和删除的记录。
  • 如果有未使用的空间小于新插入的记录,则在那里写入数据,有溢出指针指向其他块的未经处理的数据。

更新

  • 如果用户使用较长的数据更新现有数据会怎样? MyISAM会将记录标记为已删除并找到适合新数据的地方,或者只是使用溢出指针指向不合适的数据吗?

再次回顾问题

  

我想确定如果我理解正确,请纠正我   这是不对的。

其他问题

  • 如果表已被删除并插入很多次,因为记录结构可能充满溢出指针和未使用的空间,它会非常低效吗?

1 个答案:

答案 0 :(得分:4)

您在有关MyISAM的问题中所掌握的信息是正确的。但是,我想解决您的另外两个问题:

最新问题

  

如果用户使用较长的数据更新现有数据会怎样? MyISAM会将记录标记为已删除并找到适合新数据的位置,或者只是使用溢出指针指向不合适的数据吗?

根据the Book

sdkm

第10章:“存储引擎”第196页第7段说

  

对于长度可变的记录,格式更复杂。第一个字节包含描述记录子类型的特殊代码。后续字节的含义因每个子类型而异,但常见的主题是存在一个字节序列,其中包含记录的长度,块中未使用的字节数,NULL值指示符标志以及可能的指针如果记录不适合以前创建的空间并且必须拆分,则继续记录。当一个记录被删除,并且要插入其位置的新记录超过原始记录大小时,就会发生这种情况。您可以通过研究storage / myisam / mi_dynrec.c中的switch语句in_mi_get_block_info()来获取不同代码含义的详细信息。

基于该段落,只有当要插入的新数据不适合先前分配的块时,旧记录才会被链接数据覆盖。这可能会导致许多膨胀的行。

其他问题

  

如果表已被删除并多次插入,因为记录结构可能充满溢出指针和未使用的空间,这会非常低效吗?

根据我之前的回答,会有很多块

  • 空格块
  • 记录的长度
  • 块中未使用的字节数
  • NULL值指示标志
  • 如果记录不适合以前创建的空间并且必须拆分,则可能是指向记录延续的指针

此类记录链接将从插入了超大数据的每一行的前面开始。这可能会很快膨胀MyISAM表.MYD文件。

SUGGESTIONS

MyISAM的默认行格式为动态。当表是动态的并且经历了大量的INSERT,UPDATE和DELETE时,这样的表需要使用

进行优化
OPTIMIZE TABLE mytable;

还有一种方法:将表格的行格式切换为固定格式。这样,所有行都是相同的大小。这就是你如何使行格式固定:

ALTER TABLE mytable ROW_FORMAT=Fixed;

即使使用固定行格式,也必须花时间查找可用记录,但时间将是O(1)搜索时间(在外行人看来,无论如何,找到可用记录需要相同的时间表有多少行或有多少删除的行)。您可以通过启用concurrent_insert来绕过该步骤,如下所示:

将此添加到my.cnf

[mysqld]
concurrent_insert = 2

不需要重启MySQL。跑吧

mysql> SET GLOBAL concurrent_insert = 2;

这会导致所有INSERT都转到表的后面而不寻找可用空间。

固定行表的优点

  • INSERT,UPDATE和DELETE会更快一些
  • SELECT快20-25%

以下是关于SELECT的一些帖子,对于固定行格式

更快

固定行表的缺点

在大多数情况下,当您运行ALTER TABLE mytable ROW_FORMAT=Fixed;时,该表可能会增长80-100%。 .MYI文件(MyISAM表的索引页)也会以相同的速率增长。

EPILOGUE

如果你想要MyISAM表的速度并且可以使用更大的表格,那么我需要我的替代建议。如果要为每个MyISAM表节省空间,请保留行格式(动态)。您必须使用动态表格更频繁地压缩表格OPTIMIZE TABLE mytable;