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 >constGROUP BY c1, c2, c3;
等価であることによって、GROUP
BYクエリに適用できる最適化はDISTINCT節のあるクエリにも適用できます。さらなるDISTINCTクエリ最適化の可能性については、項6.2.13. 「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;
