我在MySQL 5.1.41中分区了表,其中包含非常大量的数据。最近,我删除了大量导致大约500 GB碎片的数据,但分区中有大量数据。
要将该空间回收到操作系统,我不得不对分区进行解密。我提到了MySQL文档,https://dev.mysql.com/doc/refman/5.1/en/partitioning-maintenance.html让我对以下语句感到困惑,
重建分区:重建分区;这与删除存储在分区中的所有记录具有相同的效果 重新插入它们。这可用于碎片整理。
优化分区:如果您从分区中删除了大量行,或者您对分区进行了很多更改 具有可变长度行的表(即具有VARCHAR,BLOB或 TEXT列),你可以使用ALTER TABLE ... OPTIMIZE PARTITION 回收任何未使用的空间并对分区数据文件进行碎片整理。
我试过了两次,有时观察到了#34;重建"发生得更快,有时"优化"。我运行这些命令的每个分区都有数百万到数十亿的记录。我知道MySQL在每个语句上面做了什么。
是否需要根据分区中的行数应用它们?如果是这样,我可以使用多少行"优化"以及我应该使用多少"重建"?
另外,哪个更好用?
答案 0 :(得分:0)
MyISAM或InnoDB? (答案会有所不同。)
对于MyISAM,REBUILD / REORGANIZE / OPTIMIZE每个分区的工作量大致相同。
对于InnoDB,OPTIMIZE PARTITION
重建所有分区。因此,如果您想一次执行一个分区,请不要使用此功能。分区的REORGANIZE PARTITION
到相同的分区定义应该只对一个分区起作用。我推荐。
除非您拥有至少一百万行,否则通常不值得使用分区。此外,BY RANGE
是唯一具有我发现的任何性能优势的表单。
分区的主要用途可能是你要删除的时间序列" old"数据。 PARTITION BY RANGE
包含每周或每月分区,可让您高效DROP PARTITION
而不是DELETE
。 More in my blog
(我的答案适用于5.7版本的所有版本,而不仅仅是您的古董5.1。)