你能否告诉我,如果我插入新数据并删除旧数据(在表格中插入,删除底行),表格中的MySQL数据是否会在物理上碎片化?
在我进行OPTIMIZE之前,表的大小是否会以任何方式增长?
答案 0 :(得分:1)
您DELETEing
和INSERTing
的费率大致相同吗?是表InnoDB吗?
如果两者都是,那么"不要担心"。 DELETEs
将释放块,INSERTs
将重新使用这些块(如果INSERTs
正在进行,则重新使用新块。)
InnoDB表由16KB块组成,这些块以BTree结构链接在一起。你所描述的将是从树的一侧释放块并在另一侧创建新块。但是,每个块都可以驻留在任何地方,因此树的概念是"更虚拟'而不是' physical'。
完成大量搅拌后,请尝试OPTIMIZE
一次。如果它没有将表格大小减少一半,那么OPTIMIZE
不值得的进一步线索。大量搅拌后30%的收缩率是典型的。但它稳定在那个位置,并且不会超过30%。
另一方面,如果您同时拥有该表的DELETEing
大多数,那么您可能最好使用不可删除的方法重建表行。这将删除和优化步骤合二为一。然后使用它来立即翻转表格':
RENAME TABLE real TO old, new TO real; DROP TABLE old;
在重建过程中不执行任何插入操作。
答案 1 :(得分:0)
当innodb_file_per_table为OFF且所有数据将存储在ibdata文件中时。删除行时,它们只是在磁盘上标记为已删除,但InnoDB文件会占用空间,以后可以在插入/更新更多行时重复使用,但它永远不会缩小。 如果删除一些删除某些数据的表,那么除了dump / reload方法之外没有任何其他方法可以回收那些未使用的磁盘空间。
但是,如果您使用innodb_file_per_table,则可以通过在该表上运行OPTIMIZE TABLE来回收空间。 OPTIMIZE TABLE将创建一个新的相同空表。然后它会将旧表中的逐行数据复制到新表中。在此过程中,将创建一个新的.ibd表空间并回收该空间但是,共享表空间-ibbata1仍然可以增长。
更多信息 - mysql reference和percona expert