python - SQLAlchemy 外键访问优化

标签 python mysql sqlalchemy

我在两个表之间有非常简单的父子(一对一)关系。

当我通过 ID 查找时,一切似乎都正常。但是如果我为 10k IDs 运行它,它需要将近 70 秒才能返回结果。

经过我的调试我发现我的字典的外键赋值花费了大部分时间。

result = {
    "name": parent.name,
    "child_name": parent.child.name
}

如果我注释掉 "child_name",我会在大约 2 秒内(对于 10k)得到结果,而它需要大约 70 秒。

最佳答案

猜测是主查询仅从数据库中加载Parent 的实例,并且在访问parent.child 属性时,一个单独的SQL 语句是为每个 Parent 实例生成的,以便从数据库中读取 Child 数据。结果,您得到了 10K + 1 查询。

此处改进的方法是使用 Eager Loading . 对于 1-1 关系,一个不错的选择是 joinedload:

q = session.query(Parent).options(joinedload(Parent.child))

关于python - SQLAlchemy 外键访问优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095932/

相关文章:

python - 如何让玩家角色移动?

python - 将 zxJDBC 与 jython 一起使用不起作用

mysql - 在mysql查询中计算相同的值

来自具有多个 where 条件的 SQL 的 sqlalchemy 查询

python - 在 SQLAlchemy Declarative 中创建指向相关表的链接

python - SQLAlchemy delete() 函数刷新,但不提交,即使在调用 commit() 之后

python - SQLAlchemy 的 "post_update"与已从 session 中删除的对象的行为不同

python - python中的lxml xpath,如何处理丢失的标签?

mysql - mysql 和 GROUP_CONCAT 中的增量计数器

hibernate - Spring 3/Hibernate - 在运行时执行数据库转储