2016-02-15 136 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

謝謝里克:) –