使用MyISAM删除和插入MySQL行为和磁盘空间处理

我有一个关于MyISAM引擎的MySQL处理删除后的空闲空间的方式以及在插入新logging时的行为方式的问题。

例如,考虑一个新的空白数据库(例如,假设为10 kb)。

插入10000条logging(假设每条logging占用1kb)后,文件系统上的总大小变为10010kb。

然后,删除5000条logging后,文件系统上的大小仍然保持在10010 kb,即使logging数减半(这里没有什么奇怪的,这是正常的行为)。

OPTIMIZE命令可以随后对数据库进行“碎片整理”,并通过重新组织其数据来回收可用空间。

但是 ,如果我完全忽略了OPTIMIZE命令并插入了2000条新logging(所以5000条仍然有2000条新logging= 7000条logging),那么MySQL是否会将新logging的前一个删除剩余的空闲空间重用(意思是DB的大小10010 kb不会改变),或者是“追加”新的logging到数据库(也就是说,文件系统上的数据库大小将增长到12010 kb)?

谢谢! 🙂

通常,如果在DELETE操作之后,MyISAM表在数据文件的中间有可用空间,则它将在该空闲空间中插入行。 但是,由于MyISAM实现并发的方式,这取决于工作负载会发生什么。

从MySQL手册

对于有孔的表,如果另一个线程正在使用新的行,则会在表的末尾插入新行。 否则,MySQL将获得一个正常的写入锁,并将该行插入到该洞中。

甚至在微调了这个concurrent_insert参数之后。