MySQL table 数据物理碎片

MySQL table data physical fragmentation

你能告诉我,如果我插入新数据并删除旧数据(在 table 顶部插入,并删除底部行,table 中的 MySQL 数据是否会在物理上碎片化)?

在我进行优化之前,table 的大小会以任何方式增长吗?

当 innodb_file_per_table 关闭时,所有数据都将存储在 ibdata 文件中。当您删除行时,它们只是在磁盘上标记为已删除,但是 space 将被 InnoDB 文件消耗,这些文件可以在您以后 insert/update 更多行时重新使用,但它永远不会缩小。 如果您删除一些 tables 或删除一些数据,那么除了 dump/reload 方法之外,没有任何其他方法可以回收未使用的磁盘 space。

但是,如果您使用的是 innodb_file_per_table,那么您可以通过 运行 优化 TABLE 来回收 space table。 OPTIMIZE TABLE 将创建一个新的相同的空 table。然后它将逐行数据从旧 table 复制到新数据。在此过程中,将创建一个新的 .ibd tablespace 并回收 space 但是,共享的 tablespace-ibdata1 仍然可以增长。

更多信息- mysql reference and percona expert

DELETEingINSERTing 的速度差不多吗? table是InnoDB吗?

如果两者都是肯定的,那么 "don't worry"。 DELETEs 将释放块,INSERTs 将重新使用这些块(如果 INSERTs 领先,则重新使用新块)。

InnoDB tables 由 16KB 的块组成,这些块在 BTree 结构中链接在一起。您所描述的将从树的一侧释放块并在另一侧创建新块。但是,每个块都可以位于任何地方,因此 "side of the tree" 的概念比 'physical' 更多 'virtual'。

完成大量搅拌后,尝试 OPTIMIZE 一次。如果它没有将 table 大小减半,则进一步表明 OPTIMIZE 不值得。大量流失后 30% 的缩水是比较典型的。但稳定在那个左右,不会超过30%左右。

另一方面,如果您同时是 table 中的 DELETEing 最多 ,那么您最好重建 table 与不被删除的行。这将删除和优化步骤合二为一。然后用这个翻转 tables 'instantly':

RENAME TABLE real TO old, new TO real;  DROP TABLE old;

并且在重建期间进行任何插入。