The world's most popular open source database
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;

