[解決済み] MySQLでSTRAIGHT_JOINを使用する場合
質問
かなり複雑なクエリを実行したところ、実行に 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 については、インデックスの統計が古いだけでないことを確認してください ( テーブルを解析する ). これはオプティマイザが悪いクエリプランを選択する原因となり得ます。 オプティマイザヒントは一般的に最後の手段であるべきです。
クエリヒントを使用しないもう一つの理由は、データの分布が時間とともに変化したり、インデックスの選択性が変化したりなど、テーブルの成長に伴って変化する可能性があることです。 現在最適なクエリヒントが、時間とともに最適でなくなる可能性があります。 しかし、オプティマイザがクエリプランを適応させることができないのは、ヒントが古くなったからです。 オプティマイザに判断を委ねた方が、より柔軟な対応ができます。
関連
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み] mysqladminのフラッシュホストでブロックを解除する方法
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合
-
[解決済み] サブクエリ vs ジョイン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL Innodb インデックスメカニズム詳細解説
-
MySQLにおけるorder byの使用方法の詳細
-
MySQLで正規表現を使う 詳細
-
MySQLインストールチュートリアル(Linux版
-
[解決済み】DynamoDB : 提供されたキー要素がスキーマと一致しません。
-
[解決済み】マルチパート識別子をバインドできない
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
[解決済み] SQLを使用してSUMとSUBTRACTを行うには?
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?