簡體   English   中英

有沒有辦法在mysql中進行批量/更快的刪除?

[英]Is there any way to do a bulk/faster delete in mysql?

我有一個包含1000萬條記錄的表,刪除和保留最近30天的最快方法是什么。

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

如果你能提出一些最佳方法,那就太棒了。

謝謝。

隨便,我會:

  1. 重命名表格
  2. 創建一個與原始表同名的空表
  3. 從“臨時”表中抓取最近30天,然后將它們插回到新表中
  4. 刪除臨時表

這將使您能夠(幾乎)整個過程保持表格直播,並在閑暇時獲得過去30天的數據。

你可以試試分區表。

PARTITION BY LIST (TO_DAYS( date_field ))

這將為您提供每天1個分區,當您需要修剪數據時,您只需:

ALTER TABLE tbl_name DROP PARTITION p#

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

擴展Michael Todd的答案。

如果你有空間,

  1. 創建一個類似於要減小的表的空白臨時表
  2. 僅使用目標表中要包含的記錄填充臨時表
  3. 如下所示進行雙重重命名

假設: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下。 這不會鎖定表格。 您將需要運行優化表來回收空間以供其他引擎使用。 您可能無法回收磁盤空間,除非您要關閉引擎並移動數據文件。

並不是它可以幫助您解決當前的問題,但如果這是一個常規的問題,您可能需要查看合並表 :只需添加不同時間段的表,並在不再需要時從merge表定義中刪除它們。 另一種選擇是分區 ,其中刪除(最舊的)分區同樣微不足道。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM