python - 提高查询性能

标签 python mysql postgresql sqlalchemy flask-sqlalchemy

我需要从 PostgreSQL 数据库中读取和连接大量行(~500k)并将它们写入 MySQL 数据库。

我天真的做法是这样的

    entrys = Entry.query.yield_per(500)

    for entry in entrys:
        for location in entry.locations:
            mysql_location = MySQLLocation(entry.url)
            mysql_location.id = location.id
            mysql_location.entry_id = entry.id

            [...]

            mysql_location.city = location.city.name
            mysql_location.county = location.county.name
            mysql_location.state = location.state.name
            mysql_location.country = location.country.name

            db.session.add(mysql_location)

    db.session.commit()

每个 Entry 都有大约 1 到 100 个 Locations

此脚本现在运行了大约 20 小时并且已经消耗了 > 4GB 的内存,因为在提交 session 之前所有内容都保存在内存中。

随着我尝试更早提交,我遇到了类似 this 的问题.

如何提高查询性能?它需要变得更快,因为在接下来的几个月中行数将增长到大约 2500k。

最佳答案

由于您已经知道的原因,您的天真方法存在缺陷 - 占用您内存的东西是悬在内存中等待刷新到 mysql 的模型对象。

最简单的方法是根本不使用 ORM 进行转换操作。直接使用 SQLAlchemy 表对象,因为它们也快得多。

此外,您可以做的是创建 2 个 session ,并将 2 个引擎绑定(bind)到单独的 session 中!然后您可以为每个批处理提交 mysql session 。

关于python - 提高查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18014945/

相关文章:

python - 将此 while 循环转换为更高效的 while 循环

mysql - MYSQL写存储过程的难点

python - 如何在不使用抽象方法的情况下使用 abc 创建抽象类?

python - 根据日期排列 Dataframe 中的数据

mysql - 我如何制作条件 WHERE 子句(或替代方式)

php - 无法根据数据库数据选择下拉选项

sql - Postgresql 在同一张表上加入

postgresql - 为什么在循环内捕获错误会导致性能问题?

sql-server - SQL Server 和 PostgreSQL 之间的 MD5 值不匹配

Python Thrift 二进制类型需要编码?