복붙노트

[SQL] 빠른 게 뭔데, MySQL의에서 DISTINCT 또는 GROUP BY를 선택?

SQL

빠른 게 뭔데, MySQL의에서 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)
)

나는, 무엇을 더 빨리 (또는 추천) 될 직업 필드의 모든 고유 값을 얻으려면 :

SELECT DISTINCT u.profession FROM users u

또는

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

?

해결법

  1. ==============================

    1.그들은 본질적으로 서로 동일하다 (사실이 일부 데이터베이스는 후드 DISTINCT 구현하는 방법이다).

    그들은 본질적으로 서로 동일하다 (사실이 일부 데이터베이스는 후드 DISTINCT 구현하는 방법이다).

    그 중 하나가 빠른 경우, DISTINCT 될 것입니다. 두 사람은 동일하지만, 쿼리 최적화 프로그램이 GROUP BY가 어떤 그룹 멤버의 그들의 키를 활용되지 않는다는 사실을 잡을해야하기 때문이다. DISTINCT 차종이 명시 적, 그래서 당신은 약간 멍청 최적화 멀리 얻을 수 있습니다.

    의심의 테스트!

  2. ==============================

    2.당신이 직업에 인덱스가있는 경우,이 두 동의어입니다.

    당신이 직업에 인덱스가있는 경우,이 두 동의어입니다.

    당신이 경우에, DISTINCT 사용합니다.

    MySQL은 GROUP BY 결과를 정렬합니다. 당신은 할 수 있습니다 :

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

    및 DESC으로 정렬하여 직업을 얻을.

    DISTINCT 임시 테이블을 생성하고 중복 저장을 사용한다. GROUP BY 역시 동일하지만, 이후 뚜렷한 결과를 sortes.

    그래서

    SELECT DISTINCT u.profession FROM users u
    

    당신이 직업에 대한 인덱스가없는 경우, 빠릅니다.

  3. ==============================

    3.당신이 할 수있는 경우에 간단하고 짧은에 대한 이동 - DISTINCT는 당신이 당신에게 당신 만이 필요한 정확한 답을 줄 것이다 때문 찾고있는 더 많은 것 같다!

    당신이 할 수있는 경우에 간단하고 짧은에 대한 이동 - DISTINCT는 당신이 당신에게 당신 만이 필요한 정확한 답을 줄 것이다 때문 찾고있는 더 많은 것 같다!

  4. ==============================

    4.위의 답변은 모두 하나의 컬럼에 GROUP BY 대 단일 열에서 DISTINCT의 경우에, 정확합니다. 모든 DB 엔진은 자신의 구현 및 최적화를 가지고 있으며, 당신이 다음 (대부분의 경우)이 거의 차이에 대해 관심이 경우는 특정 서버 및 특정 버전에 대한 테스트를 해! 구현은 변경 될 수 ...

    위의 답변은 모두 하나의 컬럼에 GROUP BY 대 단일 열에서 DISTINCT의 경우에, 정확합니다. 모든 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는이 방식으로 일반 키워드입니다.

    사람들이 그래서 당신은 위의 모든 경우에 알맞은 ... 당신은 혼란을 얻을 수있는 답을 가지고 당신이 원하는 모든 최적화에 동안 잘못된 결과를 얻을하지 않도록주의해야한다!

  5. ==============================

    5.에 의해 그룹은 결과 동안 별개을 피 그것을 일종의을 수행함으로써 그룹입니다 고유보다 더 비싸다. 하지만 수율 메이크업 그룹에 널 (null)로 구분주고 순서와 같은 결과를 원한다면 ..

    에 의해 그룹은 결과 동안 별개을 피 그것을 일종의을 수행함으로써 그룹입니다 고유보다 더 비싸다. 하지만 수율 메이크업 그룹에 널 (null)로 구분주고 순서와 같은 결과를 원한다면 ..

    SELECT DISTINCT u.profession FROM users u
    

    와 같다

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

    6.포스트 그레스에서 어떤 경우에 의해 군에 비해 속도가 느려질 수 있습니다 아니라 별개의 (다른 DBS에 대한 망가 알고).

    포스트 그레스에서 어떤 경우에 의해 군에 비해 속도가 느려질 수 있습니다 아니라 별개의 (다른 DBS에 대한 망가 알고).

    시험 예 :

    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

    그러니 조심해 ... :)

  7. ==============================

    7.이 쿼리가 동일하지 않은 것으로 보인다. MySQL 용 적어도.

    이 쿼리가 동일하지 않은 것으로 보인다. MySQL 용 적어도.

    비교:

    두 번째 쿼리는 추가에 추가 "filesort 사용"을 제공합니다.

  8. ==============================

    8.MySQL의에서 "그룹으로는"추가 단계를 사용 filesort를. 나는 DISTINCT 빨리 GROUP BY보다 실현하고 놀라운였습니다.

    MySQL의에서 "그룹으로는"추가 단계를 사용 filesort를. 나는 DISTINCT 빨리 GROUP BY보다 실현하고 놀라운였습니다.

  9. ==============================

    9.(기능 노트의 이상)

    (기능 노트의 이상)

    경우는 고용주 당 직원 수를 얻기 위해 원하는 경우, 예를 들어 GROUP BY를 사용해야하는 경우가 있습니다 :

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

    이러한 시나리오에서 DISTINCT u.employer 바로 작동하지 않습니다. 아마도 방법이있다, 그러나 나는 단지 그것을 모른다. (누군가가 알고 있다면 방법 메모를 추가하십시오 DISTINCT와 같은 쿼리를 만들기 위해!)

  10. ==============================

    10.무거운 테스트 후 우리는 GROUP BY 빨리이라는 결론에 도달했다

    무거운 테스트 후 우리는 GROUP BY 빨리이라는 결론에 도달했다

    SELECT SQL_NO_CACHE opnamegroep_intern   카운터 FROM   opnamegroep_intern에 의해 픽업 그룹 (7,8,9,10,11,12,13) ​​그룹

    635 총 0.0944 초 기록을 0-29보기 (635 총, 쿼리 0.0484 초를했다)

    SELECT SQL_NO_CACHE 별개의 (opnamegroep_intern)   카운터 FROM   WHERE IN 픽업 그룹 (7,8,9,10,11,12,13)

    0.2117 635 초 총 (거의 100 % 더 느린) 기록을 0-29보기 (635 총, 쿼리 0.3468 초를했다)

  11. ==============================

    11.다음은 각 쿼리에 대한 2 개의 다른 경과 시간을 인쇄하는 간단한 방법입니다.

    다음은 각 쿼리에 대한 2 개의 다른 경과 시간을 인쇄하는 간단한 방법입니다.

    DECLARE @t1 DATETIME;
    DECLARE @t2 DATETIME;
    
    SET @t1 = GETDATE();
    SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
    SET @t2 = GETDATE();
    PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);
    
    SET @t1 = GETDATE();
    SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
    SET @t2 = GETDATE();
    PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);
    

    또는 시도 SET STATISTICS TIME (Transact-SQL)를 참조하십시오

    SET STATISTICS TIME ON;
    SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
    SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
    SET STATISTICS TIME OFF;
    

    그것은 단순히 (밀리 초) 아래 각 문을 구문 분석, 컴파일 및 실행하는 데 필요한 표시

     SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 2 ms.
    
  12. ==============================

    12.이 규칙 아니다

    이 규칙 아니다

    ... 각 쿼리를 완료하고 빠르게 사용할 수있는 시간을 비교하여 각 쿼리의 ... ... 별도로 구분하고 그룹을 시도

    내 프로젝트 언젠가 나는에 의해 다른 별개의 그룹을 사용

  13. ==============================

    13.당신이 (당신이 테이블에 숫자 데이터를 추가 할 경우 등 평균 합계) 모든 그룹 기능을 할 수없는 경우, 사용 DISTINCT를 선택합니다. 나는 그것이 더 빠른 생각,하지만 난 그것을 보여줄 게 ​​없다.

    당신이 (당신이 테이블에 숫자 데이터를 추가 할 경우 등 평균 합계) 모든 그룹 기능을 할 수없는 경우, 사용 DISTINCT를 선택합니다. 나는 그것이 더 빠른 생각,하지만 난 그것을 보여줄 게 ​​없다.

    당신은 속도에 대해 걱정하는 경우 어떤 경우, 컬럼에 인덱스를 만들 수 있습니다.

  14. ==============================

    14.SELECT DISTINCT 의지는 항상 GROUP BY보다 동일하거나 더 빠르다. 일부 시스템 (즉, 오라클)에, 대부분의 질의에 대한 DISTINCT와 동일하게 최적화 할 수 있습니다. (예 : SQL Server와 같은) 다른 사람에, 그것은 상당히 빠를 수 있습니다.

    SELECT DISTINCT 의지는 항상 GROUP BY보다 동일하거나 더 빠르다. 일부 시스템 (즉, 오라클)에, 대부분의 질의에 대한 DISTINCT와 동일하게 최적화 할 수 있습니다. (예 : SQL Server와 같은) 다른 사람에, 그것은 상당히 빠를 수 있습니다.

  15. ==============================

    15.문제는 그것을 허용하는 경우 당신은 단지에 대한 정규화 데이터를 시도하는 경우에, 그래서, 즉시 종료 최적화 된 이후 그 결과가 발견으로 존재와 시도 (그리고 어떤 반응을 버퍼링하지 않는) WHERE 같은 절

    문제는 그것을 허용하는 경우 당신은 단지에 대한 정규화 데이터를 시도하는 경우에, 그래서, 즉시 종료 최적화 된 이후 그 결과가 발견으로 존재와 시도 (그리고 어떤 반응을 버퍼링하지 않는) WHERE 같은 절

    SELECT FROM SOMETHING S WHERE S.ID IN ( SELECT DISTINCT DCR.SOMETHING_ID FROM DIFF_CARDINALITY_RELATIONSHIP DCR ) -- to keep same cardinality
    

    빠른 응답은 다음과 같습니다

    SELECT FROM SOMETHING S WHERE EXISTS ( SELECT 1 FROM DIFF_CARDINALITY_RELATIONSHIP DCR WHERE DCR.SOMETHING_ID = S.ID )
    

    이 항상 가능한 것은 아니지만 가능한 경우 당신은 빠른 응답을 볼 수 있습니다.

  16. from https://stackoverflow.com/questions/581521/whats-faster-select-distinct-or-group-by-in-mysql by cc-by-sa and MIT license