[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 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
.
답변
단일 열의 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의 경우.
비교:
- northwind.products에서 고유 한 제품 이름을 선택하십시오.
- 제품 이름으로 northwind.products 그룹에서 제품 이름을 선택하십시오.
두 번째 쿼리는 Extra에서 “Using filesort”를 추가로 제공합니다.