我目前使用 MySQL 作为一个非常大的数据库(1TB),每天删除的行不超过 1TB。但是我遇到了这个问题Howto: Clean a mysql InnoDB storage engine? . 我想切换到 PostgreSQL 来避免这个问题。(根据其他人的建议)
我的问题是:
- 如果我切换到 PostgreSQL,这个问题会解决吗?
- 如果我的想法不好,那么适合我的情况的最佳解决方案是什么?
我目前使用 MySQL 作为一个非常大的数据库(1TB),每天删除的行不超过 1TB。但是我遇到了这个问题Howto: Clean a mysql InnoDB storage engine? . 我想切换到 PostgreSQL 来避免这个问题。(根据其他人的建议)
我的问题是:
在 MySQL (InnoDB) 中,您可以删除行以为新行腾出空间。但是因为BTrees的组织方式,并不是1:1的。甚至不是 1000:1000。也就是说,如果您在表的一个“端”删除了一千行,那么您可能会也可能不会在另一“端”添加一千行。
另外,您说“从数据库中删除”。如果这意味着从一个表中删除以希望能够插入到不同的表中,那你就不走运了。
请提供更多细节,至少包括
SHOW CREATE TABLE
.这可能
PARTITION BY RANGE
会有用。PARTITION
这是MySQL 中为数不多的用途之一。它允许非常快速地丢弃“旧”数据块,例如每月一天的数据。但有一些警告。同样,更具体的细节会让我详细说明。如果这
DELETE
也导致了性能问题,我可以提供进一步的建议。(同样,需要更多细节。)在 PostgreSQL 中,如果删除一些行,表通常不会收缩,但空白空间可以重新用于新行。这同样适用于索引条目,但正如 Rick James 回答的那样,空间重用可能效果不佳。
尽管如此,只要您没有将磁盘空间用到极限,您基本上应该没问题。
但是,国王解决问题的方法是使用分区和删除分区而不是删除行。
尝试回答问题标题。但我相信 OP 正在询问如何将表空间返回到 PostgreSQL 中的操作系统。有两种方法:
VACUUM FULL
压缩表文件。这会将表数据复制到一个新文件并重建表上的所有索引,因此速度不快(取决于有多少数据)并且在进行过程中会阻止对表的访问。DROP TABLE
取消链接表文件,立即将它们的空间返回给操作系统。参考: