[英]Purging data from mysql tables
我有一個cron設置,用於備份生產mysql表,並希望定期清除表中的數據。 我必須刪除ID引用的多個表中的數據。
一些背景:我需要刪除大約200萬行,並且我的應用程序將不斷讀取/寫入我的數據庫(盡管它通常不應該訪問要刪除的行)
我的問題是如何在以下參數上構造刪除查詢:
假設:
刪除基於范圍而不是主索引的查詢。
刪除一個事務中的所有行,將具有很長的事務和更大的鎖。 這會增加復制滯后,復制滯后不好,新的DC使其變得很糟糕。 擁有更大的鎖也將降低您的寫入吞吐量。 (在隔離級別可序列化的情況下,甚至讀取吞吐量也可能會受到影響。)
批量刪除。 比全部刪除要好,但是隨着范圍的刪除發生,每次刪除的鎖數會更多(將使用間隙鎖和下一行鎖)。 因此,按范圍批量刪除也將具有較小的相同問題。
與全部刪除相比,批處理更可取。
其他方法:(我們需要在某個時間之前刪除行)1.有一個守護進程,它運行每個configure_time和。 一世。 從表中選擇pk,其中清除時間<您的清除時間。 -無鎖ii。 使用多個線程基於pk刪除。 -行級鎖,小事務(跨表)。
這種方法將確保較小的事務,並且僅行級鎖。 (基於主鍵的刪除只會采用行級鎖)。 您的查詢也很簡單,因此即使部分刪除成功,您也可以重新運行。 我覺得這些原子不是必需的。
要么
要么
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.