2

我的代码目前在 SQLAlchemy ORM 层中执行查询很好,如下所示:

session().query(model_a).join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

但是我遇到了一个需要几分钟才能完成的查询。事实证明 MySQL 是罪魁祸首,因为它没有按照我们要求的顺序加入。STRAIGHT_JOIN在喜欢之后添加SELECT

SELECT STRAIGHT_JOIN table_a.id FROM table_a INNER JOIN table_b ...

解决了这个问题,但我不知道是否有办法让 SQLAlchemySTRAIGHT_JOINSELECT. 文档建议可以通过添加提示,select()但这with_hint(table_a, "STRAIGHT_JOIN")会将文本添加到错误的位置,从而导致 MySQL 语法错误。这也将涉及到不理想的 ORM 之外。

我尝试过使用各种 MySQL 调试技术,例如EXPLAINANALYZE TABLE等等......但似乎无法找出 MySQL 选择错误路径的原因。手动切换连接的顺序似乎也没有帮助,所以我现在处于需要让 STRAIGHT_JOIN 工作的位置。

有任何想法吗?

4

1 回答 1

5

对于 MySQL 及其奇怪的关键字,我们直接支持这一点:

session().query(model_a).prefix_with("STRAIGHT_JOIN").join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html?highlight=query.prefix_with#sqlalchemy.orm.query.Query.prefix_with

于 2013-05-24T20:34:18.547 回答