簡體   English   中英

使用 python 清除大量數據 mysql 表

[英]purging a huge data mysql table using python

我有一個 1000M 的數據表,我需要一個自動腳本只保留最后 7 天並刪除前幾天。 我想使用 python 和塊概念來做到這一點。 想要明智地刪除塊。我有 2 個 dbts 1.我們是否有任何與 python 上的 mysql 相關的笨拙概念的庫 2. 如果沒有人可以建議我如何使用塊的最佳方法或將其與 mysql 一起應用。

我不知道一個 Python package 有一個 API 用於“分塊”從 ZDCBB673AZ44 表中刪除。 SqlAlchemy 提供了一個流暢的接口,可以做到這一點,但它與 SQL 並沒有太大區別。 我建議使用 PyMySql。

import datetime

import pymysql.cursors


connection = pymysql.connect(
    host='host',
    user='user',
    password='password',
    database='database'
)
seven_days_before_now = datetime.datetime.now() - datetime.timedelta(days=7)
chunksize = 1000
with connection.cursor() as cursor:
    sql = 'DELETE FROM `mytable` WHERE `timestamp` < %s ORDER BY `id` LIMIT %s;'
    num_deleted = None
    while num_deleted != 0:
        num_deleted = cursor.execute(sql, (seven_days_before_now, chunksize))
        connection.commit()

LIMIT只是將刪除的行數限制為chunksize ORDER BY確保DELETE是確定性的,並且它按主鍵排序,因為主鍵保證被索引; 所以即使它對每個塊進行排序,至少它是在索引列上排序的。 如果不需要確定性行為,請刪除ORDER BY ,這將導致更快的執行時間。 您需要替換連接詳細信息、表名、列名和chunksize 此外,此解決方案假定表有一個名為id的列,它是主鍵和一個自動遞增的 integer。 如果您的架構不同,您需要進行一些更改。

正如 Bernd Buffen 評論的那樣:獲得所需行為的正確方法是對表進行分區。 請考慮遷移。

而且,當然:停止使用 Python 2,從這個答案的第一個版本開始,它已經不受支持了將近兩年。

暫無
暫無

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

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