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

23 mysql database size innodb rows

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

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

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

Seb*_*Seb 32

这是偏执狂:)

数据库的大小不会不必要地增加,但是对于性能问题,空间也没有被释放.

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

这是因为:

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

正如您所看到的,空间重用,但永远不会被回馈.这是你问题的关键点.

  • @GautamSomani这是一个6年前的答案,我手头没有链接,但我可以找到这个:https://dev.mysql.com/doc/refman/5.1/en/optimize-table.html:`已删除行维护在链接列表中,后续 INSERT 操作重用旧的行位置。您可以使用 OPTIMIZE TABLE 来回收未使用的空间并对数据文件进行碎片整理。对表进行大量更改后,此语句还可能会提高使用该表的语句的性能,有时甚至会显着提高。我确信如果您通过谷歌搜索,您将能够找到更多有关此的官方信息。 (2认同)