A、B、C という3innodb
つのテーブルがあります。これら 3 つのテーブルを結合して結果を生成するクエリがあります。
SELECT A.a, B.b, C.c
from A
join B on A.id = B.a_id
join C on C.id = B.c_id
where A.a = 'example' and B.b < 10;
最初に「EXPLAIN」コマンドを使用してクエリをテストしていたとき、次の順序が得られました。
B -- C -- A
ただし、これは最適ではありません。したがって、すべてのテーブルに対して「ANALYZE TABLE」を実行すると、次のようになります。
A -- B -- C
、これは正しい順序だと思います。
次に、SQL を本番環境にデプロイしましたが、理由もなく、1 か月後、実行計画は B--C--A という不適切なオプションに戻りました。その後、何度かANALYZE TABLE
実行を試みましたが、今回は結果がわかりにくいです。B--C--A が表示されることもあれば、A--B--C が表示されることもあれば、他の実行計画が表示されることもあります。
だから私の質問は:
- 展開後に実行計画が変更されるのはなぜですか?
- 実行計画を固定する以外に (データが更新されて急速に変化するため、最適な計画は将来変更される可能性があります)、最適な計画が常に保証されることを保証する方法はありますか?