簡體   English   中英

從mysql表中清除數據

[英]Purging data from mysql tables

我有一個cron設置,用於備份生產mysql表,並希望定期清除表中的數據。 我必須刪除ID引用的多個表中的數據。

一些背景:我需要刪除大約200萬行,並且我的應用程序將不斷讀取/寫入我的數據庫(盡管它通常不應該訪問要刪除的行)

我的問題是如何在以下參數上構造刪除查詢:

  1. 在單個批量查詢中刪除還是批量刪除?
  2. 在單個事務中跨不同表進行刪除與不使用任何事務進行刪除相比。 即使我批量刪除,如果在事務中使用Delete,是否會有表級鎖?
  3. 我沒有設置任何分區,碎片會成為問題嗎?

假設:

  1. 隔離級別:可重復讀取-默認Mysql隔離級別。
  2. 刪除基於范圍而不是主索引的查詢。

  3. 刪除一個事務中的所有行,將具有很長的事務和更大的鎖。 這會增加復制滯后,復制滯后不好,新的DC使其變得很糟糕。 擁有更大的鎖也將降低您的寫入吞吐量。 (在隔離級別可序列化的情況下,甚至讀取吞吐量也可能會受到影響。)

  4. 批量刪除。 比全部刪除要好,但是隨着范圍的刪除發生,每次刪除的鎖數會更多(將使用間隙鎖和下一行鎖)。 因此,按范圍批量刪除也將具有較小的相同問題。

與全部刪除相比,批處理更可取。

其他方法:(我們需要在某個時間之前刪除行)1.有一個守護進程,它運行每個configure_time和。 一世。 從表中選擇pk,其中清除時間<您的清除時間。 -無鎖ii。 使用多個線程基於pk刪除。 -行級鎖,小事務(跨表)。

這種方法將確保較小的事務,並且僅行級鎖。 (基於主鍵的刪除只會采用行級鎖)。 您的查詢也很簡單,因此即使部分刪除成功,您也可以重新運行。 我覺得這些原子不是必需的。

要么

  1. 降低隔離級別:對於READ_COMMITED,即使是批量刪除,也應該沒問題。 在Read COMMITED隔離中,即使通過輔助鍵訪問,鎖也僅在行上。

要么

  1. 如果您的模型允許基於時間的分片並刪除數據庫本身:)

暫無
暫無

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

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