DISTINCT が
ORDER BY
と組み合わされて用いられると、多くの場合は一時テーブルが必要になります。
DISTINCT は
GROUP BY
をともなう可能性が高いので、選択されないカラムを
ORDER BY または
HAVING
したときに、どのように MySQL
が機能するかを認識しておく必要があります。項7.12.3. 「非常時カラムとの GROUP BY
および HAVING」
を参照してください。
ほとんどの場合、DISTINCT
節は GROUP BY
の特殊ケースと考えられます。たとえば、下記の
2 クエリーは等価です
SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 >const; SELECT c1, c2, c3 FROM t1 WHERE c1 >constGROUP BY c1, c2, c3;
等価であることによって、GROUP
BY クエリーに適用できる最適化は
DISTINCT
節のあるクエリーにも適用できます。さらなる
DISTINCT
クエリー最適化の可能性については、項4.2.14. 「GROUP BY 最適化」を参照してください。
LIMIT
を
row_countDISTINCT
とあわせて使用した場合、MySQL は一意の
row_count
行を検索するとただちに停止します。
使用するテーブル内のカラムを使用しない場合、MySQL
は最初にマッチするレコードを検索するとただちに未使用テーブルのスキャンを停止します。ここでは、t1
が t2 の前に使用され
(EXPLAIN
による確認)、t2
で最初のレコードが検索されると
t2 からの読み取り
(t1 の特定のレコード)
を停止します。
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
