我的代码目前在 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_JOIN
在SELECT
. 文档建议可以通过添加提示,select()
但这with_hint(table_a, "STRAIGHT_JOIN")
会将文本添加到错误的位置,从而导致 MySQL 语法错误。这也将涉及到不理想的 ORM 之外。
我尝试过使用各种 MySQL 调试技术,例如EXPLAIN
,ANALYZE TABLE
等等......但似乎无法找出 MySQL 选择错误路径的原因。手动切换连接的顺序似乎也没有帮助,所以我现在处于需要让 STRAIGHT_JOIN 工作的位置。
有任何想法吗?