我有一張擁有1000萬條記錄的表格,最後30天保留的最快刪除方法是&。有沒有辦法在mysql中做批量/更快的刪除?
我知道這可以在事件調度程序中完成,但是我擔心如果需要太多時間,它可能會鎖定表格很長時間。
如果您能提出一些最佳方法,那將會很棒。
謝謝。
我有一張擁有1000萬條記錄的表格,最後30天保留的最快刪除方法是&。有沒有辦法在mysql中做批量/更快的刪除?
我知道這可以在事件調度程序中完成,但是我擔心如果需要太多時間,它可能會鎖定表格很長時間。
如果您能提出一些最佳方法,那將會很棒。
謝謝。
關閉您的資源, SELECT .. INTO OUTFILE
,解析輸出,刪除表,LOAD DATA LOCAL INFILE optimized_db.txt
- 比更新更便宜重新創建。
謝謝,我使用select into&load數據在可以刪除記錄之前進行數據備份。它需要刪除7-8百萬條記錄,而需要備份1000萬條記錄才能進行歸檔。 – Sharpeye500 2010-09-27 22:15:39
隨口說說,我想:
釷將使您能夠通過(幾乎)整個過程保持桌面的正常運行,並在您的閒暇時間內獲取過去30天的數據。
根據數據需要的可用性,另一個選項是1.將最近30天抓到新表中2.切換兩個表(所以新表是主要表)3.移動添加的所有內容在切換過程中舊桌子(可能很少)。 – 2010-09-27 22:14:39
@Brendan這當然是更容錯的解決方案。 – 2010-09-27 22:15:45
不需要自動化。我不能重命名該表,因爲它可以通過應用程序訪問它。 – Sharpeye500 2010-09-27 22:16:31
不,它可以幫助你當前的問題,但如果這是一個普通的次數,你可能想尋找到一個merge table:只需添加表在不同的時間段,並從merge
表定義刪除它們時,沒有更長的需要。另一種選擇是partitioning,其中刪除(最早的)分區同樣微不足道。
你可以嘗試分區表。
PARTITION BY LIST (TO_DAYS(date_field))
這將使你每天1個分區,當你需要修剪的數據,你只是:
ALTER TABLE tbl_name DROP PARTITION p#
要在邁克爾·託德的回答擴大。
如果你有空間,
雙重重命名假設: 表是表的表名要清除從大量的數據中 newtable的是臨時表名 沒有其他的表稱爲不是Temptable
rename table table to temptable, newtable to table;
drop temptable;
這將在一個單一的交易,這將需要一個瞬間模式鎖來完成。大多數高併發應用程序不會注意到這一變化。
或者,如果您沒有空間,並且您有一個很長的窗口來清除此數據,則可以使用動態sql將主鍵插入臨時表中,並在刪除語句中加入臨時表。當您插入臨時表時,請注意max_packet_size是什麼。大多數MySQL的安裝使用16MB(16777216字節)。您對temp表的插入命令應該在max_packet_size下。這不會鎖定表格。您需要運行優化表來回收引擎剩餘部分使用的空間。除非您要關閉引擎並移動數據文件,否則您可能無法回收磁盤空間。
@ Sharpeye500 - 一旦您將表格縮小到僅僅30天的數據,剩下多少條記錄?千萬? – 2010-09-27 22:09:03
它會在1萬左右。 – Sharpeye500 2010-09-27 22:10:00
你有自動確認,設置交易等...? – MikeAinOz 2010-09-27 22:28:32