ORDER BY
と組み合わされた DISTINCT
では多くの場合に一時テーブルが必要です。
DISTINCT
では GROUP BY
を使用できるため、MySQL が ORDER BY
または HAVING
句内の選択したカラムの部分でないカラムをどのように処理するかを学んでください。 セクション12.20.3「MySQL での GROUP BY の処理」を参照してください。
ほとんどの場合、DISTINCT
句は GROUP BY
の特殊な例と考えることができます。 たとえば、次の 2 つのクエリーは同等です。
SELECT DISTINCT c1, c2, c3 FROM t1
WHERE c1 > const;
SELECT c1, c2, c3 FROM t1
WHERE c1 > const GROUP BY c1, c2, c3;
この同等性のため、GROUP BY
クエリーに適用できる最適化は DISTINCT
句のあるクエリーにも適用できます。 そのため、DISTINCT
クエリー最適化の可能性の詳細については、セクション8.2.1.17「GROUP BY の最適化」を参照してください。
LIMIT
を row_count
DISTINCT
と組み合わせた場合、MySQL は row_count
固有の行が見つかるとただちに停止します。
クエリーに指定されたすべてのテーブルのカラムを使用しない場合、MySQL は最初の一致が見つかるとただちに未使用テーブルのスキャンを停止します。 次の例では、t1
が t2
の前に使用され (これは、EXPLAIN
で確認できます)、MySQL は t2
(t1
内の特定の行の) で、最初の行を見つけると、t2
からの読み取りを停止します。
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;