1. ホーム
  2. mysql

[解決済み] MySQLでSTRAIGHT_JOINを使用する場合

2023-01-09 17:46:25

質問

かなり複雑なクエリを実行したところ、実行に 8 秒かかりました。EXPLAIN は奇妙なテーブル順序を示し、私のインデックスは FORCE INDEX ヒントを使用してもすべて使用されていませんでした。STRAIGHT_JOIN結合キーワードに出会い、INNER JOINキーワードのいくつかをこれに置き換えました。すると、かなりの速度改善が見られました。最終的には、このクエリのINNER JOINキーワードをすべてSTRAIGHT_JOINに置き換え、0.01秒で実行されるようになりました。

質問は、いつ STRAIGHT_JOIN を使用し、いつ INNER JOIN を使用するかということです。良いクエリを書いているのであれば、STRAIGHT_JOINを使用しない理由はあるのでしょうか?

どのように解決するのですか?

私は、正当な理由なく STRAIGHT_JOIN を使用することをお勧めしません。 私自身の経験では、MySQL クエリ オプティマイザは、私が望むよりも頻繁に悪いクエリ プランを選択しますが、一般的にそれを回避すべきほど頻繁ではありません。

私の推奨は、すべてのクエリを通常のJOINとして残すことです。 もしあるクエリが最適でないクエリプランを使用していることがわかったら、まずそのクエリを少し書き直すか、再構築して、オプティマイザがより良いクエリプランを選択するかどうか試してみることをお勧めします。 また、少なくとも innodb については、インデックスの統計が古いだけでないことを確認してください ( テーブルを解析する ). これはオプティマイザが悪いクエリプランを選択する原因となり得ます。 オプティマイザヒントは一般的に最後の手段であるべきです。

クエリヒントを使用しないもう一つの理由は、データの分布が時間とともに変化したり、インデックスの選択性が変化したりなど、テーブルの成長に伴って変化する可能性があることです。 現在最適なクエリヒントが、時間とともに最適でなくなる可能性があります。 しかし、オプティマイザがクエリプランを適応させることができないのは、ヒントが古くなったからです。 オプティマイザに判断を委ねた方が、より柔軟な対応ができます。