繁体   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