[mysql] MySQL에서 SELECT DISTINCT 또는 GROUP BY가 더 빠릅니다.

테이블이 있으면

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

?



답변

그것들은 본질적으로 서로 동등합니다 (사실 이것은 일부 데이터베이스가 실제로 구현 DISTINCT되는 방식입니다 ).

그들 중 하나가 빠르면 될 것 DISTINCT입니다. 두 개는 동일하지만 쿼리 최적화 프로그램은 GROUP BY그룹 구성원을 이용하지 않고 키만 사용 한다는 사실을 파악해야하기 때문입니다 . DISTINCT이것을 명시 적으로 지정하므로 약간 둔한 최적화 프로그램으로 벗어날 수 있습니다.

의심스러운 경우 테스트하십시오!


답변

에 대한 색인 profession이있는 경우이 두 가지는 동의어입니다.

그렇지 않으면을 사용하십시오 DISTINCT.

GROUP BYMySQL종류 결과. 당신은 할 수 있습니다 :

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

직업을 DESC순서대로 정렬하십시오 .

DISTINCT임시 테이블을 작성하고이를 중복 저장에 사용합니다. GROUP BY동일하지만 나중에 고유 한 결과를 정렬합니다.

그래서

SELECT DISTINCT u.profession FROM users u

에 색인이 없으면 더 빠릅니다 profession.


답변

단일 열의 DISTINCT와 단일 열의 GROUP BY의 경우 위의 모든 대답이 정확합니다. 모든 DB 엔진에는 자체 구현 및 최적화 기능이 있으며, 차이가 거의없는 경우 (대부분의 경우) 특정 서버 및 특정 버전에 대해 테스트해야합니다! 구현이 바뀔 수 있으므로 …

그러나 쿼리에서 둘 이상의 열을 선택하면 DISTINCT가 본질적으로 다릅니다! 이 경우 하나의 열 대신 모든 행의 모든 ​​열을 비교하기 때문입니다.

따라서 다음과 같은 것이 있다면

// 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는 이러한 방식으로 일반적인 키워드입니다.

따라서 모든 경우에 대해 위의 답변을 올바른 것으로 간주하지 않도록주의해야합니다 … 원하는 모든 것이 최적화하는 것이 혼란스러워지고 잘못된 결과를 얻을 수 있습니다!


답변

가능하면 가장 간단하고 가장 짧게 가십시오. DISTINCT는 원하는 답을 정확히 제공하기 때문에 찾고자하는 것보다 더 많은 것 같습니다!


답변

Group by는 결과를 정렬하는 반면 별개는 피하기 때문에 Distinct보다 고가입니다. 그러나 당신이 null 로 구별 순서를 주는 것과 같은 결과를 그룹으로 만들고 싶다면 ..

SELECT DISTINCT u.profession FROM users u

동일하다

SELECT u.profession FROM users u GROUP BY u.profession order by null


답변

postgres의 경우에 따라 그룹별로 잘 구분되지 않을 수 있습니다 (다른 db에 대해서는 알지 못함).

테스트 된 예 :

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

그러니 조심해 … 🙂


답변

쿼리가 정확히 동일하지 않은 것 같습니다. 적어도 MySQL의 경우.

비교:

  1. northwind.products에서 고유 한 제품 이름을 선택하십시오.
  2. 제품 이름으로 northwind.products 그룹에서 제품 이름을 선택하십시오.

두 번째 쿼리는 Extra에서 “Using filesort”를 추가로 제공합니다.