MySQL에서 SELECT DISTINT와 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 BY
MySQL
결과를 정렬합니다.을 사용하다
SELECT u.profession FROM users u GROUP BY u.profession DESC
DESC
disclossible을 클릭합니다.
DISTINCT
는 임시 테이블을 생성하여 중복 저장에 사용합니다. GROUP BY
는 같은 처리를 하지만 나중에 다른 결과를 정렬합니다.
그렇게
SELECT DISTINCT u.profession FROM users u
에 대한 인덱스가 없는 경우 속도가 더 빠릅니다.profession
.
위의 답변은 모두 정답입니다.단일 열의 DISTINT와 단일 열의 GROUP BY의 경우입니다.모든 db 엔진에는 자체 구현과 최적화가 있으며, (대부분의 경우) 아주 작은 차이에도 신경을 쓴다면 특정 서버 및 특정 버전에 대해 테스트해야 합니다.구현이 변경될 수 있습니다.
그러나 쿼리에서 두 개 이상의 열을 선택하는 경우 DISTINT은 기본적으로 다릅니다.이 경우 하나의 열만 비교하는 것이 아니라 모든 행의 모든 열을 비교하기 때문입니다.
예를 들어 다음과 같은 것이 있습니다.
// 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
DISTINT 키워드가 지정한 첫 번째 컬럼으로 행을 구분한다고 생각하는 것은 일반적인 오류이지만 DISTINT는 일반적인 키워드입니다.
따라서 위의 답을 모든 경우에 대해 정답으로 받아들이지 않도록 주의해야 합니다.최적화만 하면 혼란스러워지고 잘못된 결과가 나올 수 있습니다.
가능한 한 심플하고 짧은 것을 선택해 주세요.DISTINT는, 고객이 필요로 하는 정확한 답을 얻을 수 있기 때문에, 그 이상의 것을 요구하고 있는 것 같습니다.
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
그러니까 조심해...:)
Group by는 결과에 따라 정렬을 수행하지만 Group by는 결과를 회피하기 때문에 Group by보다 비용이 많이 듭니다.그러나 만약 당신이 그룹에 의한 결과를 null에 의한 명확한 순서 부여와 같게 만들고 싶다면.
SELECT DISTINCT u.profession FROM users u
와 동등하다
SELECT u.profession FROM users u GROUP BY u.profession order by null
문의가 완전히 동일하지는 않은 것 같습니다.적어도 MySQL의 경우.
비교:
- northwind.products와 구별되는 제품명을 설명합니다.
- 제품명별로 northwind.products 그룹에서 productname을 선택합니다.
두 번째 쿼리는 Extra에서 "파일 정렬 사용"을 추가로 제공합니다.
MySQL에서는Group By
는 스텝을 합니다. "는 추가 스텝을 사용합니다.filesort
수 있어요.DISTINCT
GROUP BY
깜짝 놀랐어요.
엄격한 테스트 결과 GROUP BY가 더 빠르다는 결론에 도달했습니다.
FROM sql_no_cache opnamegroep_intern FROM 을 합니다.telwerken
WHERE whereopnemergroep
:opnamegroep_intern(7,8,9,10,11,12,13) ★
635 totaal 0.0944초 Weergave van이 0~29를 기록(635 totaal, 쿼리 듀드 0.0484초)
different( FROM sql_no_cache different(opnamegroep_intern)를 선택합니다.telwerken
WHERE whereopnemergroep
635 토탈 0.2117초(거의 100% 느림) Weergave van은 0 ~29 (635 토탈, 쿼리 듀드 0.3468초)를 기록합니다.
(기능상의 주의)
GROUP BY를 사용해야 하는 경우가 있습니다. 예를 들어, 고용주당 직원 수를 얻으려면 다음과 같이 하십시오.
SELECT u.employer, COUNT(u.id) AS "total employees" FROM users u GROUP BY u.employer
, 「 」DISTINCT u.employer
제대로 작동하지 않습니다.방법이 있을지도 모르지만, 모르는 것뿐입니다.(DISTINT로 문의하는 방법을 알고 계신 분은 메모해 주세요!)
다음은 각 쿼리에 대해 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);
또는 통계 시간 설정(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.
SELECT DISTING은 항상 그룹 기준과 같거나 빠릅니다.일부 시스템(예: Oracle)에서는 대부분의 쿼리에 대해 DISTINT와 동일하게 최적화되어 있을 수 있습니다.SQL Server와 같은 다른 환경에서는 훨씬 더 빠를 수 있습니다.
이것은 규칙이 아닙니다.
각 쿼리에 대해 개별적으로 구별한 후 그룹화하여 각 쿼리를 완료하고 보다 빠른 쿼리를 사용하는 데 걸리는 시간을 비교합니다.
프로젝트에서는 그룹 바이와 다른 구별을 사용하는 경우가 있습니다.
그룹 기능(숫자 데이터를 테이블에 추가할 경우 합계, 평균 등)을 수행할 필요가 없는 경우 SELECT DISTINCT를 사용합니다.그게 더 빠를 것 같지만 보여줄 게 없어요.
어떤 경우에도 속도가 걱정되는 경우 열에 색인을 작성합니다.
문제가 발생하면 EXISTs를 사용해 보십시오.결과 발견 즉시 종료되도록 최적화되어 있기 때문입니다(그리고 응답을 버퍼링하지 마십시오). 따라서 이러한 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 )
이것이 항상 가능한 것은 아니지만, 가능한 경우 더 빠른 응답을 볼 수 있습니다.
mySQL에서 GROUP BY는 NULL을 구별된 것으로 취급하지만 DISTINT는 구별되지 않습니다.
동일한 DISTINT 쿼리를 사용하여 DISTINT를 삭제하고 선택한 필드를 GROUP BY로 추가했습니다.필드의 1개가 NULL이기 때문에 행이 많아졌습니다.
그래서 저는 mySQL에 DISTINT에 더 많은 것이 있다고 믿는 경향이 있습니다.
언급URL : https://stackoverflow.com/questions/581521/whats-faster-select-distinct-or-group-by-in-mysql
'source' 카테고리의 다른 글
PHP 7의 <=>('Spaceship' 연산자)란 무엇입니까? (0) | 2022.10.30 |
---|---|
어레이를 통해 구현된 스택을 사용한 패러테제스 매칭.balanced()를 사용하여 스택이 비어 있는지 체크하기 위해 모든 '(')'에 대해 '(')를 누르고 '(')를 팝핑했습니다. (0) | 2022.10.30 |
React 함수/Hooks 컴포넌트에 componentDismount가 동등합니까? (0) | 2022.10.30 |
Vue 3 - app.config가 정의되지 않았습니다.이 오류를 회피하는 방법 (0) | 2022.10.30 |
Google Chrome에서 인라인 Javascript로 중단점을 설정하는 방법은 무엇입니까? (0) | 2022.10.30 |