2016-02-15 93 views
1

我已经在我的MySQL 5.1.41中对表进行了分区,这些表保存了大量的数据。最近,我删除了大量导致大约500 GB碎片的数据,但分区中有很多数据。MySQL - 重建分区vs优化分区

要将该空间回收到操作系统,我必须对分区进行分解。我提到MySQL文档,https://dev.mysql.com/doc/refman/5.1/en/partitioning-maintenance.html其困惑我用下面的语句,

重建分区:重建分区;这与删除存储在分区中的所有记录具有相同的效果,然后 将它们重新插入。这对于碎片整理很有用。

优化分区:如果已经删除大量行的从一个分区,或者如果你已与可变长度行许多变化,以分区 表(即,具有VARCHAR,BLOB或 TEXT列),可以使用ALTER TABLE ... OPTIMIZE PARTITION来回收所有未使用的空间并对分区数据文件进行碎片整理。

我试了两次,并观察到有时“重建”发生得更快,有时“优化”。我运行这些命令的每个分区都有从数百万到数十亿的记录。我知道MySQL在每条语句上面做了什么。

是否需要根据分区中的行数应用它们?如果是这样,我可以使用“优化”多少行,以及我应该使用“重建”多少行?

另外,哪个更好用?

回答

0

MyISAM或InnoDB? (答案会有所不同。)

对于MyISAM,REBUILD/REORGANIZE/OPTIMIZE将花费每个分区大致相同的工作量。

对于InnoDB,OPTIMIZE PARTITION重建全部分区。所以,如果你想一次只做一个分区,就不要使用它。 REORGANIZE PARTITION分区到相同的分区定义应该只对一个分区起作用。我建议。

除非您有至少一百万行,否则通常不值得使用分区。另外BY RANGE是唯一具有我发现的任何性能优势的形式。

也许分区的主要用途是用时间序列来删除“旧”数据。 PARTITION BY RANGE每周或每月分区让您非常高效地DROP PARTITION而不是DELETEMore in my blog

(我的答案适用于所有版本通过5.7,不只是你的古董5.1。)

+0

嘿瑞克!感谢您的回答。但那不是我正在寻找的那个。我提到了你的博客文章,它只关注RANGE分区。我的表是LIST分区。也许我应该在我的问题中指出这一点。它们是MyISAM存储引擎。我需要知道应对我的方案应用哪种维护策略。我在单独的分区上运行ALTER ... REBUILD/OPTIMIZE。我需要知道REBUILD和OPTIMIZE是否应该根据分区中的行数完成,哪些更快完成......:) –

+0

'LIST' _might_有用,如果它有点像'RANGE'使用。 ('HASH'可能永远都是无用的)。至于'REBUILD' /'OPTIMIZE' - 这两者(在MyISAM上做的事情基本相同) - 复制数据并重建索引。因此,它们很可能会等量的时间。 –

+0

谢谢里克:) –