304

テーブルがあれば

CREATE TABLE users (
  id int(10) unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  profession varchar(255) NOT NULL,
  employer varchar(255) NOT NULL,
  PRIMARY KEY  (id)
)

professionそして、フィールドのすべての一意の値を取得したいのですが、より高速な(または推奨される)ものは次のとおりです。

SELECT DISTINCT u.profession FROM users u

また

SELECT u.profession FROM users u GROUP BY u.profession

?

4

16 に答える 16

284

それらは本質的に互いに同等です(実際、これは一部のデータベースが内部DISTINCTで実装する方法です)。

そのうちの 1 つが速い場合は、 になりますDISTINCT。これは、2 つが同じであっても、クエリ オプティマイザはGROUP BY、グループ メンバーを利用しておらず、キーだけを利用しているという事実を把握する必要があるためです。DISTINCTこれを明示的にするので、少しばかげたオプティマイザーで逃げることができます。

迷ったらテスト!

于 2009-02-24T12:09:22.143 に答える
109

に索引がある場合profession、これら 2 つは同義語です。

そうでない場合は、 を使用しますDISTINCT

GROUP BY並べ替えのMySQL結果。あなたもできる:

SELECT u.profession FROM users u GROUP BY u.profession DESC

職業をDESC順番に並べ替えます。

DISTINCT一時テーブルを作成し、それを複製の保存に使用します。GROUP BY同じことを行いますが、後で個別の結果をソートします。

そう

SELECT DISTINCT u.profession FROM users u

にインデックスがない場合は、の方が高速ですprofession

于 2009-02-27T14:50:08.283 に答える
26

単一列の DISTINCT と単一列の GROUP BY の場合、上記の答えはすべて正しいです。すべての db エンジンには独自の実装と最適化があり、(ほとんどの場合) わずかな違いを気にする場合は、特定のサーバーと特定のバージョンに対してテストする必要があります! 実装は変更される可能性があるため...

ただし、クエリで複数の列を選択すると、DISTINCT は本質的に異なります。この場合、1 つの列だけでなく、すべての行のすべての列を比較するためです。

したがって、次のようなものがある場合:

// This will NOT return unique by [id], but unique by (id,name)
SELECT DISTINCT id, name FROM some_query_with_joins

// This will select unique by [id].
SELECT id, name FROM some_query_with_joins GROUP BY id

DISTINCT キーワードは指定した最初の列によって行を区別すると考えるのはよくある間違いですが、DISTINCT はこのように一般的なキーワードです。

そのため、上記の回答をすべてのケースで正しいと見なさないように注意する必要があります...最適化することだけを考えていたときに、混乱して間違った結果が得られる可能性があります。

于 2013-05-16T10:49:53.613 に答える
17

可能であれば、最も単純で最短のものを探してください-DISTINCTは、必要な答えだけを正確に提供するという理由だけで、あなたが探しているもののようです!

于 2009-02-24T13:37:28.670 に答える
8

明確に区別できるのは、postgresの場合によってはgroup byよりも遅くなる可能性があります(他のデータベースについてはわかりません)。

テスト例:

postgres=# select count(*) from (select distinct i from g) a;

count 

10001
(1 row)

Time: 1563,109 ms

postgres=# select count(*) from (select i from g group by i) a;

count
10001
(1 row)

Time: 594,481 ms

http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I

ので注意してください ... :)

于 2011-11-18T13:56:26.670 に答える
5

クエリはまったく同じではないようです。少なくともMySQLの場合。

比較:

  1. 説明 Northwind.products から個別の製品名を選択
  2. 製品名で Northwind.products グループから製品名を選択します

2 番目のクエリは、Extra で「ファイルソートの使用」を追加で提供します。

于 2009-02-24T12:20:18.247 に答える
3

徹底的なテストの結果、GROUP BY の方が高速であるという結論に達しました。

SELECT sql_no_cache opnamegroep_intern FROM telwerken WHERE opnemergroepIN (7,8,9,10,11,12,13)​​ group by opnamegroep_intern

635 合計 0.0944 秒 Weergave van records 0 - 29 (635 合計、クエリ duurde 0.0484 秒)

SELECT sql_no_cache 個別 (opnamegroep_intern) FROM telwerken WHERE opnemergroepIN (7,8,9,10,11,12,13)

635 合計 0.2117 秒 (ほぼ 100% 遅い) Weergave van records 0 - 29 (635 合計、クエリ duurde 0.3468 秒)

于 2015-06-09T09:12:37.410 に答える
2

(より機能的なメモ)

たとえば、雇用主ごとの従業員数を取得する場合など、GROUP BY を使用する必要がある場合があります。

SELECT u.employer, COUNT(u.id) AS "total employees" FROM users u GROUP BY u.employer

そのようなシナリオDISTINCT u.employerでは正しく機能しません。方法があるのか​​もしれませんが、私はそれを知りません。(誰かが DISTINCT でそのようなクエリを作成する方法を知っている場合は、メモを追加してください!)

于 2012-05-21T17:15:41.027 に答える
0

グループ関数 (テーブルに数値データを追加する場合の合計、平均など) を実行する必要がない場合は、SELECT DISTINCT を使用します。私はそれがより速いと思いますが、私はそれを示すものは何もありません.

いずれにせよ、速度が心配な場合は、列にインデックスを作成してください。

于 2009-02-24T12:09:28.150 に答える
0

SELECT DISTINCT は常に GROUP BY と同じか、より高速です。一部のシステム (Oracle など) では、ほとんどのクエリで DISTINCT と同じになるように最適化されている場合があります。他のもの (SQL Server など) では、かなり高速になる可能性があります。

于 2009-02-27T14:55:01.720 に答える
0

mySQL では、GROUP BY は NULL を別個のものとして扱いますが、DISTINCT はそうではありません。
まったく同じ DISTINCT クエリを取得し、DISTINCT を削除し、選択したフィールドを GROUP BY として追加しました。フィールドの 1 つが NULL であるため、さらに多くの行を取得しました。

だから..私は、mySQL の DISTINCT にはもっと多くの機能があると信じがちです。

于 2021-10-09T23:06:04.880 に答える