日期:2014-05-16  浏览次数:20951 次

mysql 删除数据空洞问题,谢谢
MyISAM参数:
当concurrent_insert=0时,不允许并发插入功能。 
当concurrent_insert=1时,允许对没有洞洞的表使用并发插入,新数据位于数据文件结尾(缺省)。 
当concurrent_insert=2时,不管表有没有洞洞,都允许在数据文件结尾并发插入。

问题:
1 上面说的“洞洞”是删除数据造成的,是表中任何一字段有索引才有这问题吧?,还是跟索引无关
2 一个表用什么命令或方法知道是否存在空洞?
3 怎么“填充”空洞?

谢谢各位前辈讲解,

------解决方案--------------------
1 如果是自增主键 则不存在洞洞的问题 因为永远都是插在文件末尾
2 要写脚本自己判断
3 如果是自增主键 无需关注


myisam基本已经N年没有改动了 各项指标都不如innodb了
------解决方案--------------------
问题:
1 上面说的“洞洞”是删除数据造成的,是表中任何一字段有索引才有这问题吧?,还是跟索引无关
>>: 有没有索引,都可能由于删除数据造成“空洞”。

2 一个表用什么命令或方法知道是否存在空洞?
>>: 这个?貌似可以通过查看表数据文件对应的物理大小变化来判断,如果插入数据以后,数据文件大小保持不变,证明它插入的位置在空洞所在的空间。

3 怎么“填充”空洞?
>>:mysql ISAM引擎自己去实现。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。

当 concurrent_insert设置为0时,不允许并发插入。

当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。如果有空洞的话虽然不能很好的并发,但是MySQL还是可以使用INSERT DELAYED来提升插入性能(仅适用于MyISAM,MEMORY和ARCHIVE引擎)。

当 concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录,这时MySQL允许INSERT和SELECT语句在中间没有空数据块的MyISAM表中并行运行。