我已经读过好几次了,在MySQL中的InnoDB表中删除一行后,它的空间不会被重用,所以如果你对表进行大量INSERT,然后定期删除一些行,表将使用越来越多的空间在磁盘上,就像根本没有删除行一样。
最近我被告知,已删除行占用的空间会被重新使用,但只有在某些事务完成后才能重新使用,甚至不会完全使用。我现在很困惑。
有人能给我解释一下吗?我需要对 InnoDB 表进行大量插入,然后每隔 X 分钟我需要删除超过 Y 分钟的记录。我这里有InnoDB表不断增长的问题吗,还是偏执?
这是偏执狂:)
数据库的大小不会不必要地增长,但由于性能问题,空间也不会被释放。
您最有可能听到的是,如果删除记录,空间不会返还给操作系统。相反,它被保留为空白空间,供数据库随后重复使用。
这是因为:
被重复使用,但从未归还。这就是你问题的关键点。
使用每个表的 ibdata 文件,这将 使您能够删除记录复制 数据到新表并删除旧表 表,从而恢复记录。
您必须认真思考,您的硬盘上是否有足够的空间来执行上述功能之一(就我而言,我认为 1TB 不足以完成所有这些操作)
对于 Innotab 表(和 mysql 本身),如果数据库大小很大,则选项相当有限。
知道跟踪被删除的小条目使用的空间需要多少开销,然后 SQL 查找将使用部分或全部空间的新条目,在我看来,一些优化代码可能认为该空间应该只是成为死区并且不能被重新利用。如果用于识别已删除空间的条目占用的临时空间多于从已删除区域恢复的临时空间,则可能会在某个时间点完成删除,但该空间没有任何链接到它,这将导致数据库大小增长。
我建议创建一个临时数据库,并在周末运行一些测试代码,重现您正在做的事情,删除一个或多个条目,添加可能/可能不完全相同大小的新条目,然后让它运行周末。
第二天检查数据库大小。
这样你100%知道会发生什么。