これは情報に基づく推測です。 MySQLは、HAVING
句がtrueのときに停止するほどスマートではありません。どうして? MySQLはGROUP BY
を最初に実行してからORDER BY
を実行するためです。私が知る限り、インデックスを使用している場合でも、フィルタリングを集約ステップに進めるわけではありません。
このクエリーでは意味をなさないSELECT col1
は無視されます。
ペアが一意であるcol2
/col3
場合は、あなたがより良いパフォーマンスを得る可能性があります:
SELECT col1
FROM t
WHERE EXISTS (SELECT 1
FROM t t2
WHERE t2.col2 = t.col2 AND t2.col3 <> t.col3
);
これは一致した最初のcol3
行で停止します。状況はあなたが本当にcol3
のNULL
値をチェックしているということであれば、:
SELECT col1
FROM t
WHERE EXISTS (SELECT 1
FROM t t2
WHERE t2.col2 = t.col2 AND t2.col3 IS NOT NULL AND t2.id <> t.id
) AND
col3 IS NOT NULL;
これらの後者の2つのクエリを使用すると、t(col2, col3)
にインデックスを持っていると仮定します。