首页 > 解决方案 > 在 MySQL 数据库中保存 pandas 数据帧的最快方法是什么

问题描述

我正在用 python 编写代码来生成和更新基于另一个数据库中的另一个 mysql 表的 mysql 表。

我的代码是这样的:

对于 date_range 中的日期:

  1. 在 db1 中查询两个日期之间的数量

  2. 在 pandas 中做一些工作 => df

  3. 在 db2 中删除具有 df 中 id 的行

  4. 用 df.to_sql 保存 df

操作 1-2 耗时不到 2s,而操作 3-4 最多耗时 10s。第 4 步比第 3 步多花 4 倍。如何改进我的代码以使编写过程更高效

我已经为第 3 步和第 4 步分块了 df。我已经添加method=multi.to_sql(这根本不起作用)。我想知道我们是否可以做得更好;

with db.begin() as con:
    for chunked in chunks(df.id.tolist(), 1000):
        _ = con.execute(""" DELETE FROM table where id 
                            in {} """.format(to_tuple(chunked)))
    for chunked in chunks(df.id.tolist(), 100000):        
        df.query("id in @chunked").to_sql('table', con, index=False, 
        if_exists='append')

感谢您的帮助

标签: pythonmysqlpandas

解决方案


我发现df.to_sql速度很慢。我解决这个问题的一种方法是将数据帧输出到 csv 文件中,df.to_csv并使用 BCP in 将 csv 中的数据插入表中,然后在插入完成后删除 csv 文件。您可以使用 subprocess 在 python 脚本中运行 BCP。


推荐阅读