被删除的行占用的空间会被重新使用吗?

问题描述 投票:0回答:3

我已经读过好几次了,在MySQL中的InnoDB表中删除一行后,它的空间不会被重用,所以如果你对表进行大量INSERT,然后定期删除一些行,表将使用越来越多的空间在磁盘上,就像根本没有删除行一样。

最近我被告知,已删除行占用的空间会被重新使用,但只有在某些事务完成后才能重新使用,甚至不会完全使用。我现在很困惑。

有人能给我解释一下吗?我需要对 InnoDB 表进行大量插入,然后每隔 X 分钟我需要删除超过 Y 分钟的记录。我这里有InnoDB表不断增长的问题吗,还是偏执?

mysql database size innodb rows
3个回答
37
投票

这是偏执狂:)

数据库的大小不会不必要地增长,但由于性能问题,空间也不会被释放。

您最有可能听到的是,如果删除记录,空间不会返还给操作系统。相反,它被保留为空白空间,供数据库随后重复使用。

这是因为:

    DB需要有一些HD空间来保存其数据;如果没有空间,它首先保留一些空白空间。
  • 当您插入新行时,会使用该空间的一部分。
  • 当您用完可用空间时,会保留一个新块,依此类推。
  • 现在,
  • 当您删除一些行时,为了防止保留越来越多的块,它的空间保持空闲,但永远不会返还给操作系统,因此您可以稍后再次使用它,而无需保留新的块。
如您所见,空间

被重复使用,但从未归还。这就是你问题的关键点。


2
投票

使用每个表的 ibdata 文件,这将 使您能够删除记录复制 数据到新表并删除旧表 表,从而恢复记录。
  • 使用 mysqldump 和大量 收据清理整个 服务器。检查以下内容:
  • http://dev.mysql.com/doc/refman/5.0/en/adding-and-removing.html
  • 当您使用巨大的表(在我的例子中它们超过 250GB)时,所有这些方法都变得不切实际,并且您必须让它们删除记录以获得更好的性能。

您必须认真思考,您的硬盘上是否有足够的空间来执行上述功能之一(就我而言,我认为 1TB 不足以完成所有这些操作)

对于 Innotab 表(和 mysql 本身),如果数据库大小很大,则选项相当有限。


0
投票

知道跟踪被删除的小条目使用的空间需要多少开销,然后 SQL 查找将使用部分或全部空间的新条目,在我看来,一些优化代码可能认为该空间应该只是成为死区并且不能被重新利用。如果用于识别已删除空间的条目占用的临时空间多于从已删除区域恢复的临时空间,则可能会在某个时间点完成删除,但该空间没有任何链接到它,这将导致数据库大小增长。

我建议创建一个临时数据库,并在周末运行一些测试代码,重现您正在做的事情,删除一个或多个条目,添加可能/可能不完全相同大小的新条目,然后让它运行周末。

第二天检查数据库大小。

这样你100%知道会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.