Php

定期有效地刪除大量(400 萬行)mysql 數據

  • March 4, 2014

我們有一個 mysql 表,在任何給定時間都有大約 1200 萬行。我們需要刪除舊數據以使表的大小在一定程度上易於管理。

現在我們每天午夜執行這個查詢,使用一個 cron 作業:

DELETE FROM table WHERE endTime < '1393632001'

上次執行查詢時,它檢查了 4,602,400,花了 3 多分鐘,CPU 飛速發展。

半夜CPU猛增

我們可以做些什麼來防止 CPU、同步數據庫連接、磁碟提示深度等在清除舊數據的同時不合理地飆升?

PS:您會注意到查詢實際上發生在我們使用周期中相當不合時宜的時間。假設我們已經將查詢的時間安排在每天使用的最低點。此外,“endTime”上沒有索引,如果可能的話,我更願意保持這種狀態,因為有大量數據被非常定期地插入,而且查找不多。

您的問題的解決方案是一種稱為“分區”的 MySQL 功能。文件在這裡

分區的作用是將單個表儲存在單獨的“分區”中。這些由特定表達式定義,通常是列值或範圍。在您的情況下,這可能基於endTime- 假設記錄何時創建並且它不會更改。

您將endTime在每個分區中儲存一天的價值。然後刪除步驟將截斷一個分區,而不是刪除一個大表中的一堆行。分區截斷將是一種更快的方法。

引用自:https://dba.stackexchange.com/questions/60106