2009-10-05 57 views
0

我正在執行一些MySQL表維護,這將意味着刪除一些冗餘列並添加一些新的。RENAME快於DROP + ADD在MySQL更改表

某些要刪除的列與添加的列類型相同。如果我利用這一點並重新使用一些現有的列,程序會更快嗎?

我的理由是,更改列名應該是一個簡單的表元數據更改,而刪除和添加列意味着要麼在文件末尾找到空間(分段數據),要麼用正確的列重建每一行,重新放在磁盤上的相同位置。

有問題的引擎是MyISAM,我不知道它究竟會如何處理這個問題,所以我想聽聽以前一直處於相同情況的任何人!

+0

難道你不是專欄? – 2009-10-05 15:59:33

+0

好吧,發現;) – jond 2009-10-05 16:03:43

+0

你更新和刪除+插入之間的疑問嗎?我不確定要理解!什麼是你「重用」? – 2009-10-05 16:06:24

回答

1

除非你有一個嚴重問題的表現,我不會採取重命名的方法 - 因爲所有的髒數據,你將離開躺在周圍。

此外,通過刪除表,你會引起任何指標得到再建 - 這是一個好主意,在每過一段時間......

馬丁

+0

謝天謝地,列沒有被使用。這是唯一的擔憂嗎?我更擔心我正在假設MySQL如何工作! 至於性能,你提出了一個好點,但它是一個現場,所以如果可以避免的話,停機時間不會超過20分鐘的停機時間。 – jond 2009-10-05 16:13:54

0

我會放棄的列。無論哪種方式你都會有碎片。這應該在您的日常維護計劃中處理。在大量修改操作之後,您可以加速這些操作。

0

如果您不知道,在Myisam表中,每個ALTER TABLE操作都會執行整個表的副本,因此表將在您的服務器需要複製表時鎖定。

0

我已經使用了相同的邏輯,並且因爲即使對於不需要重寫表格的更改(即表格重命名),MySQL bug也導致它認爲這是一個需要重寫表。

如果您正在處理的字段是日期,日期時間或時間戳字段,那麼您很可能會被這種情況觸發,這意味着您應該假設它必須進行完全重寫並按此方式進行計劃。