MySQL 5.1 リファレンスマニュアル :: 6 最適化 :: 6.2 SELECTステートメントおよびその他のクエリの最適化 :: 6.2.8 DISTINCT最適化
« 6.2.7 IS NULL最適化

6.2.9 LEFT JOINとRIGHT JOIN最適化 »
Section Navigation      [Toggle]
  • 6.2 SELECTステートメントおよびその他のクエリの最適化
  • 6.2.1 EXPLAINを使用して、クエリを最適化する
  • 6.2.2 クエリパフォーマンスの推定
  • 6.2.3 SELECTクエリの速度
  • 6.2.4 WHERE 節最適化
  • 6.2.5 Range 最適化
  • 6.2.6 インデックス結合最適化
  • 6.2.7 IS NULL最適化
  • 6.2.8 DISTINCT最適化
  • 6.2.9 LEFT JOINとRIGHT JOIN最適化
  • 6.2.10 入れ子結合最適化
  • 6.2.11 外側Join 単純化
  • 6.2.12 ORDER BY最適化
  • 6.2.13 GROUP BY最適化
  • 6.2.14 LIMITの最適化
  • 6.2.15 テーブルスキャンを避ける方法
  • 6.2.16 INSERTステートメントの速度
  • 6.2.17 UPDATEステートメントの速度
  • 6.2.18 DELETEステートメントの速度
  • 6.2.19 その他の最適化のヒント

6.2.8. DISTINCT最適化

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;
Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates