329 votes

Qu'est-ce qui est le plus rapide, SELECT DISTINCT ou GROUP BY dans MySQL ?

Si j'ai un tableau

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)
)

et je veux obtenir toutes les valeurs uniques de profession champ, ce qui serait plus rapide (ou recommandé) :

SELECT DISTINCT u.profession FROM users u

ou

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

?

4 votes

Vous pourriez tester par vous-même en posant la question. Il est irritant de constater qu'il est presque impossible de construire un scénario dans lequel DISTINCT est plus performant que GROUP BY - ce qui est ennuyeux car ce n'est clairement pas le but de GROUP BY. Cependant, GROUP BY peut produire des résultats trompeurs, ce qui, à mon avis, est une raison suffisante pour l'éviter.

0 votes

Il y a un autre duplicata avec une réponse différente. voir MySql - Distinct vs Groupe par <<< il dit que GROUP BY est mieux

0 votes

Veuillez consulter aquí si vous voulez mesurer la différence de temps entre DISTINCT et GROUP BY pour exécuter votre requête.

309voto

SquareCog Points 12947

Ils sont essentiellement équivalents l'un à l'autre (en fait, c'est ainsi que certaines bases de données implémentent DISTINCT sous le capot).

Si l'un d'entre eux est plus rapide, ce sera DISTINCT . En effet, bien que les deux soient identiques, un optimiseur de requête devrait tenir compte du fait que votre GROUP BY ne profite d'aucun membre du groupe, seulement de ses clés. DISTINCT rend cela explicite, ce qui permet de s'en sortir avec un optimiseur un peu plus bête.

En cas de doute, testez !

90 votes

DISTINCT ne sera plus rapide que si vous n'avez pas d'index (car il ne trie pas). Si vous avez un index et qu'il est utilisé, ce sont des synonymes.

14 votes

La définition de DISTINCT y GROUP BY diffèrent en ce que DISTINCT n'a pas besoin de trier la sortie, et GROUP BY le fait par défaut. Cependant, dans MySQL, même un DISTINCT + ORDER BY pourrait toujours être plus rapide qu'un GROUP BY en raison des conseils supplémentaires pour l'optimiseur comme expliqué par SquareCog.

1 votes

DISTINCT est beaucoup plus rapide avec une grande quantité de données.

117voto

Quassnoi Points 191041

Si vous avez un index sur profession Ces deux termes sont synonymes.

Si vous ne le faites pas, utilisez DISTINCT .

GROUP BY en MySQL les résultats du triage. Vous pouvez même le faire :

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

et de trier vos professions dans DESC l'ordre.

DISTINCT crée une table temporaire et l'utilise pour stocker les doublons. GROUP BY fait la même chose, mais trie les résultats distincts après coup.

Alors

SELECT DISTINCT u.profession FROM users u

est plus rapide, si vous n'avez pas d'index sur profession .

10 votes

Vous pouvez ajouter ORDER BY NULL au GROUP BY pour éviter le tri.

0 votes

Toujours plus lent même avec le regroupement par null

0 votes

@ThanhTrung : qu'est-ce qui est plus lent que quoi ?

27voto

daniel.gindi Points 1065

Toutes les réponses ci-dessus sont correctes, pour le cas de DISTINCT sur une seule colonne par rapport à GROUP BY sur une seule colonne. Chaque moteur de base de données a sa propre implémentation et ses propres optimisations, et si vous vous souciez de la très petite différence (dans la plupart des cas), vous devez tester contre un serveur spécifique ET une version spécifique ! Comme les implémentations peuvent changer...

MAIS, si vous sélectionnez plus d'une colonne dans la requête, alors le DISTINCT est essentiellement différent ! Car dans ce cas, il comparera TOUTES les colonnes de toutes les lignes, au lieu d'une seule colonne.

Donc si vous avez quelque chose comme :

// 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

C'est une erreur commune de penser que le mot-clé DISTINCT distingue les lignes par la première colonne que vous avez spécifiée, mais le DISTINCT est un mot-clé général de cette manière.

Vous devez donc faire attention à ne pas considérer les réponses ci-dessus comme correctes dans tous les cas... Vous pourriez être confus et obtenir de mauvais résultats alors que tout ce que vous vouliez, c'était optimiser !

5 votes

Bien que cette question est à propos de MySQL, il faut noter que la deuxième requête fonctionnera uniquement dans MySQL. Presque tous les autres SGBD rejetteront la deuxième instruction car il s'agit d'une utilisation non valide de l'opérateur GROUP BY.

0 votes

Eh bien, "presque" est une définition problématique :-) Il serait beaucoup plus utile que vous indiquiez le SGBD spécifique que vous utilisez. testé pour voir qu'il génère une erreur pour cette déclaration.

4 votes

Postgres, Oracle, Firebird, DB2, SQL Server pour les débutants. MySQL : sqlfiddle.com/#!2/6897c/1 Postgres : sqlfiddle.com/#!12/6897c/1 Oracle : sqlfiddle.com/#!12/6897c/1 SQL Server : sqlfiddle.com/#!6/6897c/1

17voto

Tim Points 219

Choisissez le plus simple et le plus court si vous le pouvez - DISTINCT semble être plus ce que vous recherchez, seulement parce qu'il vous donnera EXACTEMENT la réponse dont vous avez besoin et seulement cela !

9voto

OptilabWorker Points 51

Bien distinct peut être plus lent que group by à certaines occasions dans postgres (je ne sais pas pour les autres bases de données).

exemple testé :

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

alors faites attention ... :)

0 votes

GROUP BY est également plus rapide que DISTINCT dans AWS Redshift, parce que GROUP BY utilise un XN HashAggregate et DISTINCT utilise un XN Unique . C'est le même problème que les anciennes versions de Postgres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X