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

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

我对带有 MyISAM 引擎的 MySQL 如何处理删除后的可用/空白空间以及插入新记录时的行为方式存在疑问。

例如,考虑一个新的和空的数据库(我们假设是 10 kb,仅举例)。

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

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

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

,如果我完全忽略 OPTIMIZE 命令并插入 2000 条新记录(因此,仍有 5000 条 + 2000 条新记录 = 总共 7000 条记录),MySQL 是否会重用以前删除后留下的可用空间来存储新记录(这意味着 10010 kb 的数据库大小不会改变)或者它是否会将新记录“附加”到数据库(这意味着文件系统上的数据库大小将增长到 12010 kb)?

谢谢! :)

答案1

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

MySQL 手册

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

甚至在对concurrent_insert参数进行微调之后也是如此。

相关内容