24

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

最近有人告诉我,已删除行占用的空间会被重新使用,但只有在某些事务完成之后才会重新使用,即使是这样 - 还没有完全使用。我现在很困惑。

有人可以让我明白这一点吗?我需要在 InnoDB 表中执行大量 INSERT,然后每 X 分钟我需要删除超过 Y 分钟的记录。我在这里遇到了不断增长的 InnoDB 表的问题,还是偏执狂?

4

2 回答 2

34

这是偏执狂:)

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

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

这是因为:

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

如您所见,空间重复使用,但从未归还。这是你问题的关键点。

于 2009-03-11T12:44:00.077 回答
2

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

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

您将不得不认真考虑,您的硬盘上是否有足够的空间来执行上述功能之一(在我的情况下,我认为 1TB 不足以完成所有这些操作)

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

于 2009-11-14T05:22:07.303 回答