このMySQLのクエリはMySQLの構文と「OR」パフォーマンス
SELECT o.id
FROM descriptions_programs d, titles_programs t, programs o
WHERE (d.object_id=o.id
AND MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE)
AND d.current=1)
AND (t.object_id=o.id
AND MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE)
AND t.current=1)
だけで正常に動作しかし、私は1 AND ORとを交換した場合、クエリは非常に長い時間を実行します。 (私はそれを殺す必要があります):
SELECT o.id
FROM descriptions_programs d, titles_programs t, programs o
WHERE (d.object_id=o.id
AND MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE)
AND d.current=1)
OR (t.object_id=o.id
AND MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE)
AND t.current=1)
これはなぜですか? +中国のシンプルさにハングアップしないでください。私はデバッグのためにこれを単純化しました。また、MATCH AGAINSTテストのうちの1つだけを実行すると、正常に動作するので、どちらも問題ありません。私は誤ってORを使用して巨大な結合を引き起こしているという感覚を得るが、私はそれを得ていない。私は以前、2つの副選択のUNIONでn INテストを使用していましたが、これもうまくいくはずです。右?
更新日: per bobinceさんのリクエストそれは超低速ではありませんが、〜500msで、それはUNIONをdiscussed hereとして使用するほど速くはありません。
mysql> explain SELECT o.id
-> FROM programs o
-> JOIN titles_programs t ON t.object_id=o.id
-> JOIN descriptions_programs d ON d.object_id=o.id
-> WHERE MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) AND d.current=1
-> OR MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) AND t.current=1
-> ;
+----+-------------+-------+-------+
----------------+----------------+---------+----------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+----------------+----------------+---------+----------------------+--------+-------------+
| 1 | SIMPLE | o | index | PRIMARY | PRIMARY | 4 | NULL | 148666 | Using index |
| 1 | SIMPLE | d | ref | object_current | object_current | 4 | haystack.o.id | 1 | |
| 1 | SIMPLE | t | ref | object_current | object_current | 4 | haystack.d.object_id | 1 | Using where |
+----+-------------+-------+-------+----------------+----------------+---------+----------------------+--------+-------------+
まだ違いはありません。私はそれを殺す前に> 1分間実行されます。 ORをANDに変更し、ミリ秒単位で実行します。 2つのMATCH AGAINSTフレーズのいずれかを削除する場合も同じです。 –
't'テーブルだけを実行してみてください。 "FROM"と "WHERE"節の両方から 'd'を取り除く。その後、実行時間は何ですか?答えが "それは永遠にかかる"場合、それは "OR"の問題ではありません、それは単にテーブルスキャンが本当に遅いです。 –
「OR」を「AND」に変更するか、またはt * dの動作になるかに注意してください。また、あいまいさの場合にはカッコを入れる必要があります:MySQLのコンベンションが分かりませんが、 "foo and bar or car"と言うと、 "foo and bar"や "car"を意味する可能性があります。 –