当您在MyISAM表上运行delete时,它会在表中留下一个漏洞,直到对表进行优化。
这会影响并发插入。在默认设置中,concurrent_inserts只对没有漏洞的表工作。但是,在MyISAM的文档中,在concurrent_insert部分中,它说:
为所有MyISAM表,甚至那些有漏洞的表启用并发插入。对于有孔的表,如果另一个线程正在使用新行,则在表的末尾插入新行。否则,MySQL将获得一个普通的写锁,并将该行插入孔中。
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_concurrent_insert
这是否意味着每当将新行插入到表中时,MyISAM都会自动填充漏洞?以前,我以为在优化表格之前,这些洞是不会被修复的。
发布于 2010-05-28 16:31:29
是的,MyISAM表重用已删除/空闲的空间(对于所有情况都是这样,我不知道)。
通过删除一些记录并插入一些新的记录就可以很容易地观察到这一点--该表的MyISAM数据文件不会增长。
发布于 2010-05-28 16:33:14
插入表的中间需要一个锁。因此,在默认设置中,MySQL将倾向于填充漏洞,尽管它将防止并发插入。
所以,是的,MySQL更喜欢填补这些漏洞。
将concurrent_inserts设置为2会告诉MySQL,如果表上有锁,则在表的末尾插入,这不需要锁,尽管仍有漏洞需要填补。因此,这允许并发插入,即使中间有洞,代价是要花更长的时间来填补这些漏洞。
https://stackoverflow.com/questions/2930747
复制相似问题