2

当您在 MyISAM 表上运行删除时,它会在表中留下一个洞,直到该表被优化。

这会影响并发插入。在默认设置下,concurrent_inserts 仅适用于没有孔的表。但是,在 MyISAM 的文档中,在 concurrent_insert 部分下它说:

为所有 MyISAM 表启用并发插入,即使是那些有漏洞的表。对于有孔的表,如果它正在被另一个线程使用,则在表的末尾插入新行。否则,MySQL 会获取一个正常的写锁并将该行插入到孔中。

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_concurrent_insert

这是否意味着 MyISAM 会在向表中插入新行时自动填充孔?以前我认为在优化表之前不会修复这些孔。

4

2 回答 2

1

是的,MyISAM 表重用已删除/可用空间。(这是否适用于所有情况,我不知道)。

这可以通过删除少量记录并插入一些新记录来轻松观察到 - 该表的 MyISAM 数据文件不会增加大小。

于 2010-05-28T16:31:29.860 回答
1

插入表格中间需要锁。因此,在默认设置中,MySQL 将倾向于填充漏洞,即使它会阻止并发插入。

所以,是的,MySQL 更喜欢填补这些漏洞。

将 concurrent_inserts 设置为 2 告诉 MySQL 如果表上有锁,则在末尾插入,这不需要锁,即使仍有孔要填充。因此,即使中间有孔,这也允许同时插入,但要花费更长的时间来填充孔。

于 2010-05-28T16:33:14.540 回答