我的代码目前在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 ...
修复了问题,但我无法弄清楚是否有办法让SQLAlchemy在STRAIGHT_JOIN
之后添加SELECT
。文档建议可以通过select()
将提示添加到with_hint(table_a, "STRAIGHT_JOIN")
,但这会将文本添加到错误的位置,从而导致MySQL语法错误。这也可能涉及到不理想的ORM之外。
我尝试过使用各种MySQL调试技术,如EXPLAIN
,ANALYZE TABLE
等......但似乎无法找出MySQL选择错误路径的原因。手动切换连接顺序似乎也没有帮助,所以我现在处于需要让STRAIGHT_JOIN工作的位置。
有什么想法吗?
答案 0 :(得分:4)
我们直接支持这种情况只是针对MySQL及其奇怪的关键字:
session().query(model_a).prefix_with("STRAIGHT_JOIN").join(
(model_b, something == somethingelse)
).join(
(model_c, something == somethingelse)
) # etc ...