[英]Is there any way to do a bulk/faster delete in mysql?
我有一個包含1000萬條記錄的表,刪除和保留最近30天的最快方法是什么。
我知道這可以在事件調度程序中完成,但我擔心的是如果花費太多時間,它可能會鎖定表很長時間。
如果你能提出一些最佳方法,那就太棒了。
謝謝。
隨便,我會:
這將使您能夠(幾乎)整個過程保持表格直播,並在閑暇時獲得過去30天的數據。
你可以試試分區表。
PARTITION BY LIST (TO_DAYS( date_field ))
這將為您提供每天1個分區,當您需要修剪數據時,您只需:
ALTER TABLE tbl_name DROP PARTITION p#
擴展Michael Todd的答案。
如果你有空間,
假設:table是要從newtable清除大量數據的表的表名,是staging表名,沒有其他表被稱為temptable
rename table table to temptable, newtable to table;
drop temptable;
這將在單個事務中完成,這將需要瞬時模式鎖定。 大多數高並發應用程序都不會注意到這種變化。
或者,如果您沒有空間,並且有一個很長的窗口來清除此數據,則可以使用動態sql將主鍵插入臨時表,並將臨時表連接到delete語句中。 插入臨時表時,請注意max_packet_size是什么。 大多數MySQL安裝使用16MB(16777216字節)。 temp表的insert命令應該在max_packet_size下。 這不會鎖定表格。 您將需要運行優化表來回收空間以供其他引擎使用。 您可能無法回收磁盤空間,除非您要關閉引擎並移動數據文件。
關閉你的資源, SELECT .. INTO OUTFILE
,解析輸出,刪除表, LOAD DATA LOCAL INFILE optimized_db.txt
- 重新創建比更新更便宜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.