Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


8.2.1.17 DISTINCT の最適化

ORDER BY と組み合わされた DISTINCT では多くの場合に一時テーブルが必要です。

DISTINCT では GROUP BY を使用できるため、MySQL が ORDER BY または HAVING 句内の選択したカラムの部分でないカラムをどのように処理するかを学んでください。セクション12.19.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.16「GROUP BY の最適化」を参照してください。

LIMIT row_countDISTINCT と組み合わせた場合、MySQL は row_count 固有の行が見つかるとただちに停止します。

クエリーに指定されたすべてのテーブルのカラムを使用しない場合、MySQL は最初の一致が見つかるとただちに未使用テーブルのスキャンを停止します。次の例では、t1t2 の前に使用され (これは、EXPLAIN で確認できます)、MySQL は t2 (t1 内の特定の行の) で、最初の行を見つけると、t2 からの読み取りを停止します。

SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;