私のコードは現在、次のように 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 ...
STRAIGHT_JOIN
問題は修正されましたが、SQLAlchemy に の後に追加させる方法があるかどうかわかりませんSELECT
。select()
ドキュメントはヒントをviaに追加できることを示唆してwith_hint(table_a, "STRAIGHT_JOIN")
いますが、これにより間違った場所にテキストが追加され、MySQL 構文エラーが発生します。これには、ORM の外に出ることも含まれますが、これは理想的ではありません。
EXPLAIN
などのさまざまな MySQL デバッグ手法を使用してみましたがANALYZE TABLE
、MySQL が間違ったパスを選択している理由がわかりません。結合の順序を手動で切り替えても効果がないように見えるので、STRAIGHT_JOIN を機能させる必要がある立場になりました。
何か案は?