DISTINCT
が ORDER
BY
と組み合わされて用いられると、多くの場合はテンポラリテーブルが必要になります。
DISTINCT
は GROUP
BY
をともなう可能性が高いので、選択されないカラムをORDER
BY
または
HAVING
した時に、どのように MySQL
が機能するかを認識しておく必要があります。
項11.11.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
クエリ最適化の可能性については、項6.2.13. 「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;