Что быстрее, SELECT DISTINCT или GROUP BY в MySQL? - PullRequest
257 голосов
/ 24 февраля 2009

Если у меня есть стол

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

Ответы [ 15 ]

1 голос
/ 17 июля 2015

Это не правило

Для каждого запроса .... попробуйте отдельно различаться, а затем сгруппировать по ... сравните время выполнения каждого запроса и используйте более быстрый ....

В моем проекте иногда я использую group by, а другие - разные

1 голос
/ 09 июня 2015

После тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее

ВЫБРАТЬ sql_no_cache opnamegroep_intern ОТ telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) ​​группа по opnamegroep_intern

635 всего 0,0944 секунды Weergave van записывает 0 - 29 (635 всего, запрос duurde 0.0484 сек)

ВЫБРАТЬ sql_no_cache отличный (opnamegroep_intern) ОТ telwerken ГДЕ opnemergroep В (7,8,9,10,11,12,13) ​​

635 всего 0,2117 секунд (почти на 100% медленнее) Weergave van записывает 0 - 29 (всего 635, запрос duurde 0.3468 сек)

1 голос
/ 24 февраля 2009

Если вам не нужно выполнять какие-либо групповые функции (сумма, среднее и т. Д., Если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее, но мне нечего показать.

В любом случае, если вас беспокоит скорость, создайте индекс для столбца.

0 голосов
/ 09 июня 2014

Если проблема разрешает это, попробуйте с 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 )

Это не всегда возможно, но когда доступно, вы увидите более быстрый ответ.

0 голосов
/ 27 февраля 2009

SELECT DISTINCT всегда будет таким же или быстрее, чем GROUP BY. В некоторых системах (например, Oracle) он может быть оптимизирован, чтобы быть таким же, как DISTINCT для большинства запросов. На других (таких как SQL Server) это может быть значительно быстрее.

...