Если у меня есть стол
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
делает это явным, так что вы можете обойтись немного более тупым оптимизатором.Если есть сомнения, проверьте!
источник
DISTINCT
иGROUP BY
отличается тем, чтоDISTINCT
не нужно сортировать вывод, иGROUP BY
по умолчанию делает. Однако, в MySQL дажеDISTINCT
+ORDER BY
может еще быстрее , чемGROUP BY
из - за дополнительные подсказки для оптимизатора , как объяснена SquareCog.Если у вас есть индекс
profession
, эти два являются синонимами.Если нет, то используйте
DISTINCT
.GROUP BY
вMySQL
сортировке результатов. Вы даже можете сделать:и приведите свои профессии в
DESC
порядок.DISTINCT
создает временную таблицу и использует ее для хранения дубликатов.GROUP BY
делает то же самое, но сортирует отличные результаты впоследствии.Так
быстрее, если у вас нет индекса на
profession
.источник
ORDER BY NULL
к,GROUP BY
чтобы избежать сортировки.Все ответы выше верны, для случая DISTINCT в одном столбце против GROUP BY в одном столбце. Каждый механизм БД имеет свою собственную реализацию и оптимизацию, и если вы заботитесь об очень небольшой разнице (в большинстве случаев), то вам придется тестировать на конкретном сервере И на конкретной версии! Как реализации могут измениться ...
НО, если вы выберете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае он будет сравнивать ВСЕ столбцы всех строк, а не только один столбец.
Так что если у вас есть что-то вроде:
Распространенной ошибкой считается, что ключевое слово DISTINCT различает строки по первому указанному вами столбцу, но DISTINCT является общим ключевым словом в этом смысле.
Таким образом, люди, с которыми вы должны быть осторожны, чтобы не принимать приведенные выше ответы как правильные для всех случаев ... Вы можете запутаться и получить неправильные результаты, в то время как все, что вам нужно, это оптимизировать!
источник
Сделайте самое простое и самое короткое, если можете - DISTINCT, кажется, больше того, что вы ищете, только потому, что он даст вам именно тот ответ, который вам нужен, и только это!
источник
Группировка by обходится дороже чем Distinct, так как Group by делает сортировку по результату, а отдельный избегает его. Но если вы хотите сделать группировку по результату, дайте тот же результат, что и отдельный, задайте порядок по нулю .
равно
источник
SELECT profession FROM users GROUP BY profession
В некоторых случаях в Postgres хорошо различимый может быть медленнее, чем групповой (не знаю о других БД).
проверенный пример:
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
так что будьте осторожны ... :)
источник
Кажется, что запросы не совсем одинаковы. По крайней мере, для MySQL.
Для сравнения:
Второй запрос дает дополнительно «Использование файловой сортировки» в Extra.
источник
ORDER BY NULL
кGROUP BY
версии и они будут одинаковыми.В MySQL , «
Group By
» использует дополнительный шаг:filesort
. Я понимаюDISTINCT
, быстрееGROUP BY
, и это было неожиданно.источник
После тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее
ВЫБЕРИТЕ sql_no_cache opnamegroep_intern ОТ
telwerken
ГДЕopnemergroep
В (7,8,9,10,11,12,13) группировать по opnamegroep_intern635 итого 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 секунд)
источник
(больше функциональной ноты)
Есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на одного работодателя:
В таком случае
DISTINCT u.employer
не работает правильно. Возможно, есть способ, но я просто не знаю его. (Если кто-то знает, как сделать такой запрос с помощью DISTINCT, добавьте примечание!)источник
Вот простой подход, который будет печатать 2 разных прошедших времени для каждого запроса.
ИЛИ попробуйте УСТАНОВИТЬ ВРЕМЯ СТАТИСТИКИ (Transact-SQL)
Он просто отображает количество миллисекунд, необходимое для анализа, компиляции и выполнения каждого оператора, как показано ниже:
источник
Это не правило
Для каждого запроса .... попробуйте отдельно различаться, а затем сгруппировать по ... сравните время выполнения каждого запроса и используйте более быстрый ....
В моем проекте иногда я использую группу, а другие
источник
Если вам не нужно выполнять какие-либо групповые функции (сумма, среднее и т. Д., Если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее, но мне нечего показать.
В любом случае, если вас беспокоит скорость, создайте индекс для столбца.
источник
SELECT DISTINCT всегда будет таким же или быстрее, чем GROUP BY. В некоторых системах (например, Oracle) он может быть оптимизирован, чтобы быть таким же, как DISTINCT для большинства запросов. На других (таких как SQL Server) это может быть значительно быстрее.
источник
Если проблема позволяет, попробуйте использовать EXISTS, так как он оптимизирован для завершения, как только будет найден результат (и не буферизует какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, подобного этому
Более быстрый ответ будет:
Это не всегда возможно, но когда доступно, вы увидите более быстрый ответ.
источник