Php
定期有效地刪除大量(400 萬行)mysql 數據
我們有一個 mysql 表,在任何給定時間都有大約 1200 萬行。我們需要刪除舊數據以使表的大小在一定程度上易於管理。
現在我們每天午夜執行這個查詢,使用一個 cron 作業:
DELETE FROM table WHERE endTime < '1393632001'
上次執行查詢時,它檢查了 4,602,400,花了 3 多分鐘,CPU 飛速發展。
我們可以做些什麼來防止 CPU、同步數據庫連接、磁碟提示深度等在清除舊數據的同時不合理地飆升?
PS:您會注意到查詢實際上發生在我們使用周期中相當不合時宜的時間。假設我們已經將查詢的時間安排在每天使用的最低點。此外,“endTime”上沒有索引,如果可能的話,我更願意保持這種狀態,因為有大量數據被非常定期地插入,而且查找不多。
您的問題的解決方案是一種稱為“分區”的 MySQL 功能。文件在這裡。
分區的作用是將單個表儲存在單獨的“分區”中。這些由特定表達式定義,通常是列值或範圍。在您的情況下,這可能基於
endTime
- 假設記錄何時創建並且它不會更改。您將
endTime
在每個分區中儲存一天的價值。然後刪除步驟將截斷一個分區,而不是刪除一個大表中的一堆行。分區截斷將是一種更快的方法。