刪除範圍內的十億條記錄與精確 ID 查找 MYSQL
我有一個大約 700GB 的數據庫表,有 10 億行,數據大約是 500GB,索引是 200GB,我正在嘗試刪除 2021 年之前的所有數據,2021 年大約有 298,970,576 行,在此之前剩餘的是 708,337,583 行.
要刪除它,我在我的 python shell 中執行一個不間斷的查詢
DELETE from table_name where id < 1762163840 limit 1000000;
id -> 1762163840 代表 2021 年的數據。刪除 1 百萬行需要將近 1200-1800 秒。
有什麼辦法可以加快這個速度,因為目前的方式已經執行了 15 天以上,而且到目前為止沒有太多數據刪除,而且還會持續更多天。
我想如果我用我想要刪除的所有記錄的 id 製作一個表格,然後做一個精確的地圖,比如
DELETE from table_name where id in (select id from _tmp_table_name);
那會很快嗎?它會比首先創建一個包含所有記錄的新表然後刪除它更快嗎?
數據庫在 RDS 上設置,實例類為db.r3.large 2 vCPU 和 15.25 GB RAM,僅執行 4-5 個連接
我會使用小得多的批次,並在特定範圍內刪除:
DELETE from table_name where id BETWEEN ? AND ?
從第一個數字開始,等於表的最小 id,第二個數字比它高 1000。做1000000個批次太大了,時間太長,回滾段長太大。
然後當你循環時,將範圍的開始和結束增加 1000,當它到達 1762163840 時終止。
無論如何,這將需要很長時間。
有些人使用的一種替代策略是創建一個新表,而不是刪除大部分數據,只複製您想要保留的少量行,然後交換錶。這將花費更少的時間,但管理並發更新很複雜。如果您的表是僅插入的,則更容易。
根據我的經驗,執行此類操作的最快方法是執行
mysqldump
using--where
來獲取我想要的記錄,然後DROP
獲取CREATE
表格。當然,這只能在我可以將所有人踢出伺服器的預定維護時段內完成:mysqldump -h {server_ip} -u admin -p db_name tbl_name - -where="id>=1762163840" > sql_out.sql
然後:
mysql -h {server_ip} -u admin -p db_name < sql_out.sql
DROP TABLE
這通常比 快幾倍DELETE
,並且您可以獲得乾淨索引的額外好處。