提高查询性能

时间:2013-08-02 10:41:17

标签: 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的内存,因为所有内容都保留在内存中,直到会话被提交。

我早先尝试提交,我遇到了this等问题。

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

1 个答案:

答案 0 :(得分:1)

你天真的方法是有缺陷的,因为你已经知道了 - 吃内存的东西是悬挂在内存中等待刷新到mysql的模型对象。

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

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