私は、「午前」のチャット(「普通」と「サービス」の両方)からuser.id = 1のすべてのメッセージ(着信と発信) 'イベントMySQLは、ほぼ同じ選択でプライマリキーがどこにあるかを最適化します
このディスプレイそれら(添付画像の選択1)
SELECT *
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND event.name = 'morning'
しかし、私は除外しなければならない 『私は、送信者午前サービス』メッセージを。 これはうまく動作しますが、私はそれ(画像上の選択2)
SELECT *
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND event.name = 'morning'
AND message.id NOT IN (
SELECT message.id
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND sender = 1
AND chat_type.name = 'service'
)
スキーマを選択し、結果を好きではない:
(あなたはまた、明示的に選択されている属性を呼び出す必要があります)あなたが好きではないのはなぜ溶液?走るのにどれくらい時間がかかりますか?いくつのレコードがありますか?クエリを最適化したい場合、plsは影響を受けるテーブルのすべてのインデックスとクエリの説明の結果を共有します。 – Shadow
まだ多くのフィールドがありません;)プライマリキーフィールドと外部キーフィールドのみがインデックスされました。 IF-ELSEはサブクエリの代わりにwhere節を使うことができると思いますが、何百万行も高速で動作するのは面白いですね。 – Xitroff