私は内部結合を持つMySQLクエリを持っています.1つは結合を残し、データベースには多くのデータが残っていて、非常に遅いです。これは大体私のクエリです:MySQL LEFT JOIN ON条件の順
SELECT
main_table.*
FROM
main_table
INNER JOIN
...
LEFT JOIN
second_table ON (main_table.id = second_table.ref_id AND second_table.type = 'foo' AND second_table.bar IS NULL
WHERE
second_table.id IS NULL
;
main_table
からエントリはsecond_table
内の1つの以上の参照のエントリを有することができます。 main_table
からすべての結果を取得したい場合は、結果がsecond_table
であるか、または第2のテーブル(type 'foo'
またはbar
がNULLである)には関係のないデータのみが含まれます。
をEXPLAIN に見ると、MySQLは最初ref_id
をチェックするだけで、他の条件を確認するために非常に少数の結果を残してしまうのに対し、まだ、結果の何千につながること、type = 'foo'
続く、bar IS NULL
最初に検索。
私だけではないtype
またはbar
ため、ref_id
にインデックスを持っていると私はちょうど最初ref_id
のクエリ検索を得ることができれば、私は、インデックスそれらに必要性を感じていません。
--edit:私はMySQLは他の上bar
を好む理由はおそらくですので(それが実際のデータを持ち、ゆっくりと走る)データベースのコピーに対して、type
と個別bar
にインデックスをも持っていないことに気づきましたキー。私は複数のフィールドにまたがるキーを検討しています。 -
誰もこの種のクエリを最適化する方法を知っていますか? ON条件で特定の順序でMySQLを強制することは可能ですか?
"解決策":関連するすべてのフィールドにインデックスを追加しました。
JOINがインデックス番号ref_id
で最初に実行されたとすれば、これは本当の解決策ではないと私は信じています。それが唯一のインデックスだったときにはおそらくそうでしたが、私の同僚は何らかの理由で他のフィールドに別々にインデックスを追加する考えを持っていました。
あなたができるとは思わない注文を保証できる場合でも、クエリを変更すると何が起こる可能性がありますか?その後、注文が再び変わる可能性があります。どこにでも役立つインデックスを追加するだけではいかがですか? –
私は「wanna」という言葉で質問に答えません。それは単なるルールです。 – Strawberry
私は今、 "どうしたいと思っているのか違いがありますか?")を検索しています) –