Что быстрее distinct или group by

Что быстрее, выберите DISTINCT или GROUP BY в MySQL?

если у меня есть таблица

и я хочу получить все уникальные значения profession поле, что было бы быстрее (или рекомендуется):

15 ответов

они по существу эквивалентны друг другу (на самом деле это как некоторые базы данных реализации DISTINCT под капотом).

когда в сомнении, тест!

если у вас есть индекс на profession эти два слова-синонимы.

GROUP BY на MySQL результаты разные. Вы даже можете сделать:

и получить ваши профессии отсортированы в DESC порядок.

DISTINCT создает временную таблицу и использует его для хранения дубликатов. GROUP BY делает то же самое, но сортирует различные результаты впоследствии.

все ответы выше верны, для случая DISTINCT на одном столбце vs GROUP BY на одном столбце. Каждый движок БД имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень маленькой разнице (в большинстве случаев), то вам нужно протестировать против конкретного сервера и конкретной версии! Как реализации могут измениться.

но, если вы выбираете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае это будет сравнить все столбцы всех строк, а не только один столбец.

Так что если у вас есть что-то вроде:

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

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

well distinct может быть медленнее, чем group by в некоторых случаях в postgres (не знаю о других dbs).

равна

похоже, что запросы не совсем одинаковы. По крайней мере для MySQL.

второй запрос дает дополнительно «использование filesort» в Extra.

(более функциональное Примечание)

есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на работодателя:

в таком случае DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто не знаю его. (Если кто-то знает, как сделать такой запрос с DISTINCT, пожалуйста, добавьте Примечание!)

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

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

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

выберите sql_no_cache opnamegroep_intern От telwerken Где opnemergroep IN (7,8,9,10,11,12,13) группа по opnamegroep_intern

635 totaal 0.0944 сек Weergave van records 0-29 (635 totaal, query duurde 0.0484 sec)

выберите sql_no_cache distinct (opnamegroep_intern) От telwerken Где opnemergroep IN (7,8,9,10,11,12,13)

635 totaal 0.2117 секунд ( почти 100% медленнее ) Weergave van records 0-29 (635 totaal, query duurde 0.3468 sec)

в моем проекте когда-то я использую group by и другие distinct

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

Он просто отображает количество миллисекунд, необходимых для анализа, компиляции и выполнения каждого оператора, как показано ниже:

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

Если проблема позволяет это, попробуйте с EXISTS, так как она оптимизирована для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, как это

более быстрый ответ был бы:

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

Источник

Что быстрее, SELECT DISTINCT или GROUP BY в MySQL?

Если у меня есть таблица

ОТВЕТЫ

Ответ 1

Они по существу эквивалентны друг другу (на самом деле это то, как некоторые базы данных реализуют DISTINCT под капотом).

Если вы сомневаетесь, проверьте!

Ответ 2

GROUP BY в MySQL сортирует результаты. Вы даже можете сделать:

DISTINCT создает временную таблицу и использует ее для хранения дубликатов. GROUP BY делает то же самое, но потом сортирует отдельные результаты.

Ответ 3

Ответ 4

Все приведенные выше ответы верны, в случае DISTINCT в одном столбце против GROUP BY в одном столбце. Каждый движок db имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень небольшой разнице (в большинстве случаев), вам нужно протестировать конкретную версию сервера и конкретной версии! Поскольку реализации могут меняться.

НО, если вы выберете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае он будет сравнивать ВСЕ столбцы всех строк, а не только один столбец.

Итак, если у вас есть что-то вроде:

Общей ошибкой считается мысль о том, что ключевое слово DISTINCT различает строки по указанному первому столбцу, но DISTINCT является ключевым словом в этом виде.

Итак, люди, которым вы должны быть осторожны, чтобы не принимать ответы выше, как правильные для всех случаев. Вы можете запутаться и получить неправильные результаты, пока все, что вы хотели, было оптимизировать!

Ответ 5

хорошо различий может быть медленнее, чем группа в некоторых случаях в postgres (не знаю о других dbs).

поэтому будьте осторожны. )

Ответ 6

Кажется, что запросы не совсем одинаковы. По крайней мере, для MySQL.

Второй запрос дополнительно добавляет «Использование filesort» в Экземпляр.

Ответ 7

Группировка дороже, чем Distinct, так как Group by делает сортировку результата, а отчетливо избегает ее. Но если вы хотите, чтобы группа с уроком получала тот же результат, что и разные, давайте порядок по null..

равно

Ответ 8

(больше функциональной заметки)

Есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на одного работодателя:

В таком сценарии DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто этого не знаю. (Если кто-то знает, как сделать такой запрос с DISTINCT, добавьте примечание!)

Ответ 9

Ответ 10

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

SELECT sql_no_cache opnamegroep_intern FROM telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) ​​группа by opnamegroep_intern

SELECT sql_no_cache отличный (opnamegroep_intern) FROM telwerken ГДЕ opnemergroep IN (7,8,9,10,11,12,13) ​​

Ответ 11

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

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

Ответ 12

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

Он просто отображает количество миллисекунд, необходимых для синтаксического анализа, компиляции и выполнения каждого оператора, как показано ниже:

Ответ 13

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

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

Ответ 14

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

Ответ 15

Если проблема позволяет, попробуйте с EXISTS, так как он оптимизирован для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, подобного этому

Более быстрый ответ:

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

Источник

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Страниц: 1

#1 20.03.2008 12:22:17

Скорость работы DISTINCT и GROUP BY

Как-то на практике замечал, что GROUP BY работает быстрее, чем DISTINCT, но всё же такие запросы достаточно медленны. Можно ли как-то ускорить их? Я так понимаю, что индексы они не используют, или только у меня не используют Что быстрее distinct или group by. Смотреть фото Что быстрее distinct или group by. Смотреть картинку Что быстрее distinct или group by. Картинка про Что быстрее distinct или group by. Фото Что быстрее distinct или group by
Подскажите плз выход.

#2 20.03.2008 20:53:42

Re: Скорость работы DISTINCT и GROUP BY

DISTINCT, согласно описанию, выполняет неявный GROUP BY. Отличие в производительности может быть, но объяснить его рационально сложно. Индексы использует, но нужны правильные составные индексы, так как GROUP BY выполняется после WHERE. Поясню примером:

SELECT * from x WHERE y=10 GROUP BY z;

Требует индекс KEY(y,z)

Если индекса нет правильного, а есть только KEY(z), то использовать его не имеет смысла, так как придется накладывать на него условие y=10, а это в лучшем случае MERGE индексов, а в худшем, перебор таблицы.

#3 21.03.2008 09:34:22

Re: Скорость работы DISTINCT и GROUP BY

А если в условии WHERE используется несколько полей, то индекса KEY(y,z) будет достаточно, если условие y=10 будет на первом месте? Или же нужен составной индекс на все поля?

Я так понимаю, что поле группировки в составном индексе должно быть последним?

#4 21.03.2008 12:19:17

Re: Скорость работы DISTINCT и GROUP BY

Запрос:
SELECT * from x WHERE y1=10 AND y2=10 GROUP BY z;

Требует индекс KEY(y1,y2,z)

Идея в том, чтобы использовать только один ключ, если его использование обрывается в последовательности операций, выполняемых MySQL, то далее без ключей
Еще есть тема про составные индексы: http://sqlinfo.ru/forum/viewtopic.php?id=151

Кроме того, условие типа > или #5 21.03.2008 13:30:04

Re: Скорость работы DISTINCT и GROUP BY

Не совсем понял Что быстрее distinct или group by. Смотреть фото Что быстрее distinct или group by. Смотреть картинку Что быстрее distinct или group by. Картинка про Что быстрее distinct или group by. Фото Что быстрее distinct или group by
Если у меня условие идёт по 10 полям, а группировка по одиннадцатому, которое не участвует в условии, для использования индекса при группировке нужен индекс на все 11 полей? Что быстрее distinct или group by. Смотреть фото Что быстрее distinct или group by. Смотреть картинку Что быстрее distinct или group by. Картинка про Что быстрее distinct или group by. Фото Что быстрее distinct или group by

#6 21.03.2008 13:37:13

Re: Скорость работы DISTINCT и GROUP BY

#7 21.03.2008 14:07:07

Re: Скорость работы DISTINCT и GROUP BY

#8 21.03.2008 14:08:56

Re: Скорость работы DISTINCT и GROUP BY

#9 21.03.2008 14:22:06

Re: Скорость работы DISTINCT и GROUP BY

Neval написал:

Вот, к примеру, поле даты. Нужно найти записи, удовлетворяющие диапазону дат. Используем `date`>=’date1′ AND `date` 10 and a 10 and a 10 and a #10 21.03.2008 14:30:15

Re: Скорость работы DISTINCT и GROUP BY

Сразу не написал, но в моём случае в индексе есть два поля, каждое из которых ищется по больше/меньше, значит два этих поля точно нет смысла держать в индексе Что быстрее distinct или group by. Смотреть фото Что быстрее distinct или group by. Смотреть картинку Что быстрее distinct или group by. Картинка про Что быстрее distinct или group by. Фото Что быстрее distinct или group by

А есть ли преимущество в использовании BETWEEN вместо больше/меньше?

Источник

What’s faster, SELECT DISTINCT or GROUP BY in MySQL?

and I want to get all unique values of profession field, what would be faster (or recommended):

16 Answers 16

They are essentially equivalent to each other (in fact this is how some databases implement DISTINCT under the hood).

When in doubt, test!

GROUP BY in MySQL sorts results. You can even do:

and get your professions sorted in DESC order.

DISTINCT creates a temporary table and uses it for storing duplicates. GROUP BY does the same, but sortes the distinct results afterwards.

All of the answers above are correct, for the case of DISTINCT on a single column vs GROUP BY on a single column. Every db engine has its own implementation and optimizations, and if you care about the very little difference (in most cases) then you have to test against specific server AND specific version! As implementations may change.

BUT, if you select more than one column in the query, then the DISTINCT is essentially different! Because in this case it will compare ALL columns of all rows, instead of just one column.

So if you have something like:

It is a common mistake to think that DISTINCT keyword distinguishes rows by the first column you specified, but the DISTINCT is a general keyword in this manner.

So people you have to be careful not to take the answers above as correct for all cases. You might get confused and get the wrong results while all you wanted was to optimize!

Источник

Что быстрее, SELECT DISTINCT или GROUP BY в MySQL?

Если у меня есть таблица

ОТВЕТЫ

Ответ 1

Они по существу эквивалентны друг другу (на самом деле это то, как некоторые базы данных реализуют DISTINCT под капотом).

Если вы сомневаетесь, проверьте!

Ответ 2

GROUP BY в MySQL сортирует результаты. Вы даже можете сделать:

DISTINCT создает временную таблицу и использует ее для хранения дубликатов. GROUP BY делает то же самое, но потом сортирует отдельные результаты.

Ответ 3

Ответ 4

Все приведенные выше ответы верны, в случае DISTINCT в одном столбце против GROUP BY в одном столбце. Каждый движок db имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень небольшой разнице (в большинстве случаев), вам нужно протестировать конкретную версию сервера и конкретной версии! Поскольку реализации могут меняться.

НО, если вы выберете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае он будет сравнивать ВСЕ столбцы всех строк, а не только один столбец.

Итак, если у вас есть что-то вроде:

Общей ошибкой считается мысль о том, что ключевое слово DISTINCT различает строки по указанному первому столбцу, но DISTINCT является ключевым словом в этом виде.

Итак, люди, которым вы должны быть осторожны, чтобы не принимать ответы выше, как правильные для всех случаев. Вы можете запутаться и получить неправильные результаты, пока все, что вы хотели, было оптимизировать!

Ответ 5

хорошо различий может быть медленнее, чем группа в некоторых случаях в postgres (не знаю о других dbs).

поэтому будьте осторожны. )

Ответ 6

Кажется, что запросы не совсем одинаковы. По крайней мере, для MySQL.

Второй запрос дополнительно добавляет «Использование filesort» в Экземпляр.

Ответ 7

Группировка дороже, чем Distinct, так как Group by делает сортировку результата, а отчетливо избегает ее. Но если вы хотите, чтобы группа с уроком получала тот же результат, что и разные, давайте порядок по null..

равно

Ответ 8

(больше функциональной заметки)

Есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на одного работодателя:

В таком сценарии DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто этого не знаю. (Если кто-то знает, как сделать такой запрос с DISTINCT, добавьте примечание!)

Ответ 9

Ответ 10

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

SELECT sql_no_cache opnamegroep_intern FROM telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) ​​группа by opnamegroep_intern

SELECT sql_no_cache отличный (opnamegroep_intern) FROM telwerken ГДЕ opnemergroep IN (7,8,9,10,11,12,13) ​​

Ответ 11

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

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

Ответ 12

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

Он просто отображает количество миллисекунд, необходимых для синтаксического анализа, компиляции и выполнения каждого оператора, как показано ниже:

Ответ 13

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

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

Ответ 14

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

Ответ 15

Если проблема позволяет, попробуйте с EXISTS, так как он оптимизирован для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, подобного этому

Более быстрый ответ:

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *