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 >const
GROUP BY c1, c2, c3;
等価であることによって、GROUP
BY
クエリーに適用できる最適化は
DISTINCT
節のあるクエリーにも適用できます。さらなる
DISTINCT
クエリー最適化の可能性については、項4.2.14. 「GROUP BY
最適化」を参照してください。
LIMIT
を
row_count
DISTINCT
とあわせて使用した場合、MySQL は一意の
row_count
行を検索するとただちに停止します。
使用するテーブル内のカラムを使用しない場合、MySQL
は最初にマッチするレコードを検索するとただちに未使用テーブルのスキャンを停止します。ここでは、t1
が t2
の前に使用され
(EXPLAIN
による確認)、t2
で最初のレコードが検索されると
t2
からの読み取り
(t1
の特定のレコード)
を停止します。
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;