【发布时间】:2013-05-18 16:45:21
【问题描述】:
我试图了解 MyISAM 如何物理存储其记录以及在记录插入和记录删除后它如何维护其结构。我已阅读以下链接:
我想确认一下我是否理解正确,如果不正确请纠正我。
固定大小的记录
- 删除标记决定记录是否被删除。
- 记录标题保存行的哪一列包含 NULL 值
- 数据的长度是固定的。
可变大小记录
- 删除标记已替换为 BLOCK_DELETED 块类型
- 记录头保存数据长度和未使用数据长度
- 单条记录可以分成多个块,通过溢出指针连接。
删除
- 对于可变大小的记录,将块类型更改为 BLOCK_DELETED
- 通过使新删除记录的前一个指针指向最后删除的记录来维护所有已删除记录的双链表。然后,最后一条删除记录的 next 指针指向新删除的记录。
- 对于固定大小的记录,只需将删除标记更改为已删除。 (不确定他们是否使用双链表将所有已删除的记录与固定大小的记录连接起来)
插入
- 如果没有未使用的空间(已删除的记录),则在文件末尾追加数据
- 如果有适合新插入记录的未使用空间,则将新记录写入那里。
- 如果有远大于新插入记录的未使用空间,则分成两条记录:新记录和删除记录。
- 如果有小于新插入记录的未使用空间,则将数据写入那里,并有溢出指针指向其他块的未拟合数据。
更新中
- 如果用户用更长的数据更新现有数据怎么办? MyISAM 会将记录标记为已删除并找到适合新数据的位置还是简单地使用溢出指针指向不适合的数据?
再次回顾问题
我想确定我是否理解正确,如果我理解错了,请纠正我 这是不对的。
其他问题
- 如果表被多次删除和插入,是否会非常低效,因为记录结构可能会充满溢出指针和未使用的空间?
【问题讨论】:
-
相当广泛的问题,但只回答您的“附加问题”:是的,这就是为什么建议不时发出
OPTIMIZE TABLE的原因。
标签: mysql database architecture myisam