删除的行占用的空间是否会被重用?

时间:2009-03-11 12:11:41

标签: mysql database size innodb rows

我已经多次读过你在MySQL中的InnoDB表中删除一行后,它的空间没有被重用,所以如果你把很多INSERT放到一个表中然后定期删除一些行,那么表会使用更多的磁盘上有更多空间,就好像根本没有删除行一样。

最近有人告诉我,删除的行所占用的空间会被重复使用,但只有在某些事务完成后才会被重新使用 - 不完全。我现在很困惑。

有人可以帮我理解这个吗?我需要在InnoDB表中执行大量的INSERT,然后每隔X分钟我需要删除超过Y分钟的记录。我在这里有一个不断增长的InnoDB表的问题,还是偏执狂?

2 个答案:

答案 0 :(得分:32)

这是偏执狂:)

DB的大小不会不必要地增加,但是对于性能问题,空间也不会被释放。

您最常听到的内容是,如果您删除的记录中没有将返回给操作系统。相反,它被保留为一个空的空间供DB在之后重复使用。

这是因为:

  • DB需要有一些HD空间来保存其数据;如果它没有任何空间,它首先会保留一些空的空间。
  • 当您插入新行时,会使用该空格的一部分。
  • 当剩余可用空间时,会保留一个新块,依此类推。
  • 现在,删除某些行时,为了防止保留越来越多的块,其空间保持空闲但从未返回到操作系统,因此您可以在以后再次使用它任何保留新街区的需要。

正如您所看到的,空间重复使用,但从未被回复。这是你问题的关键点。

答案 1 :(得分:2)

在innodb中,没有实用的方法来释放空间。

当您使用大表(在我的情况下,它们超过250GB)时,所有这些方法都变得不切实际,并且您必须让它们删除记录以提高性能。

你必须认真思考,你的硬盘上是否有足够的空间来执行上述功能之一(在我看来,我认为1TB不足以应对所有这些行为)

使用Innotab表(和mysql本身),如果数据库大小严重,则该选项相当有限。