MyISAM漏洞会自动填充吗?

时间:2010-05-28 16:26:39

标签: mysql myisam

当您在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就会自动填充漏洞?以前我认为在你优化表格之前不会修复漏洞。

2 个答案:

答案 0 :(得分:1)

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

通过删除少量记录并插入一些新记录可以很容易地观察到这一点 - 该表的MyISAM数据文件的大小不会增大。

答案 1 :(得分:1)

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

所以,是的,MySQL更愿意填补漏洞。

将concurrent_inserts设置为2告诉MySQL,如果表上有锁,则插入最后一个,即使仍有空洞需要填充,也不需要锁定。因此,即使中间有孔,这也允许并发插入,但代价是需要更长的时间来填充孔。