2010-09-27 67 views
3

我有一張擁有1000萬條記錄的表格,最後30天保留的最快刪除方法是&。有沒有辦法在mysql中做批量/更快的刪除?

我知道這可以在事件調度程序中完成,但是我擔心如果需要太多時間,它可能會鎖定表格很長時間。

如果您能提出一些最佳方法,那將會很棒。

謝謝。

+0

@ Sharpeye500 - 一旦您將表格縮小到僅僅30天的數據,剩下多少條記錄?千萬? – 2010-09-27 22:09:03

+0

它會在1萬左右。 – Sharpeye500 2010-09-27 22:10:00

+0

你有自動確認,設置交易等...? – MikeAinOz 2010-09-27 22:28:32

回答

0

關閉您的資源, SELECT .. INTO OUTFILE,解析輸出,刪除表,LOAD DATA LOCAL INFILE optimized_db.txt - 比更新更便宜重新創建。

+0

謝謝,我使用select into&load數據在可以刪除記錄之前進行數據備份。它需要刪除7-8百萬條記錄,而需要備份1000萬條記錄才能進行歸檔。 – Sharpeye500 2010-09-27 22:15:39

5

隨口說說,我想:

  1. 重命名錶
  2. 創建具有相同名稱的空表作爲 原始表
  3. 抓住從你的「臨時」表並插入最近30天 它們放回新表
  4. 刪除臨時表

釷將使您能夠通過(幾乎)整個過程保持桌面的正常運行,並在您的閒暇時間內獲取過去30天的數據。

+1

根據數據需要的可用性,另一個選項是1.將最近30天抓到新表中2.切換兩個表(所以新表是主要表)3.移動添加的所有內容在切換過程中舊桌子(可能很少)。 – 2010-09-27 22:14:39

+0

@Brendan這當然是更容錯的解決方案。 – 2010-09-27 22:15:45

+0

不需要自動化。我不能重命名該表,因爲它可以通過應用程序訪問它。 – Sharpeye500 2010-09-27 22:16:31

1

不,它可以幫助你當前的問題,但如果這是一個普通的次數,你可能想尋找到一個merge table:只需添加表在不同的時間段,並從merge表定義刪除它們時,沒有更長的需要。另一種選擇是partitioning,其中刪除(最早的)分區同樣微不足道。

1

要在邁克爾·託德的回答擴大。

如果你有空間,

  1. 創建類似於你想要的大小
  2. 減少,只有你想在你的目的地表中的記錄填寫臨時表的表空白臨時表
  3. 不喜歡以下

雙重重命名假設: 表是表的表名要清除從大量的數據中 newtable的是臨時表名 沒有其他的表稱爲不是Temptable

rename table table to temptable, newtable to table; 
    drop temptable; 

這將在一個單一的交易,這將需要一個瞬間模式鎖來完成。大多數高併發應用程序不會注意到這一變化。

或者,如果您沒有空間,並且您有一個很長的窗口來清除此數據,則可以使用動態sql將主鍵插入臨時表中,並在刪除語句中加入臨時表。當您插入臨時表時,請注意max_packet_size是什麼。大多數MySQL的安裝使用16MB(16777216字節)。您對temp表的插入命令應該在max_packet_size下。這不會鎖定表格。您需要運行優化表來回收引擎剩餘部分使用的空間。除非您要關閉引擎並移動數據文件,否則您可能無法回收磁盤空間。

相關問題