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

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

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

Страниц: 1

#1 20.03.2008 12:22:17

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

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

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

Сразу не написал, но в моём случае в индексе есть два поля, каждое из которых ищется по больше/меньше, значит два этих поля точно нет смысла держать в индексе Sql что быстрее distinct или group by. Смотреть фото Sql что быстрее distinct или group by. Смотреть картинку Sql что быстрее distinct или group by. Картинка про Sql что быстрее distinct или group by. Фото Sql что быстрее 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!

Источник

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

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

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

15 ответов:

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

когда сомневаешься, тест!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

выберите sql_no_cache opnamegroep_intern От telwerken Где opnemergroep в группе (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 разных времени для каждого запроса.

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

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

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

быстрый ответ будет такой:

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

Источник

Что быстрее, выберите 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, как это

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

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

Источник

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

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

15 ответов

У меня есть таблица с заказами и таблица с пользователями. Возможно размещение заказа с записью в пользовательской таблице. С помощью следующего оператора MySQL я получаю повторяющиеся значения для заказов, если есть соответствующий пользователь: SELECT o.id, u.id as ‘user_id’, u.name FROM orders.

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

Когда сомневаешься, проверь!

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

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

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

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

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

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

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

для простейшего случая мы все ссылаемся на: select id from mytbl group by id и select distinct id from mytbl как мы знаем, они генерируют один и тот же план запроса, который неоднократно упоминался в некоторых пунктах, например, что лучше: Distinct или Group By Однако в hive году у первого есть.

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

равно

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

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

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

SELECT sql_no_cache opnamegroep_intern FROM telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) group by opnamegroep_intern

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

SELECT sql_no_cache различны (opnamegroep_intern) FROM telwerken WHERE 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 u.employer не работает правильно. Возможно, есть способ, но я просто не знаю его. (Если кто-то знает, как сделать такой запрос с DISTINCT, пожалуйста, добавьте Примечание!)

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

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

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

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

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

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

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

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

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

Похожие вопросы:

Возможный Дубликат : Есть ли какая-то разница между Group By и Distinct В чем разница между GROUP BY и DISTINCT в запросе MySQL?

Я понятия не имею, почему DISTINCT быстрее, чем GROUP BY/FOREACH в Pig, они должны быть такими же в фреймворке MapReduce, но ссылаются на: http://pig.apache.org/docs/r0.10.0/perf.html#distinct.

У меня есть таблица с заказами и таблица с пользователями. Возможно размещение заказа с записью в пользовательской таблице. С помощью следующего оператора MySQL я получаю повторяющиеся значения для.

для простейшего случая мы все ссылаемся на: select id from mytbl group by id и select distinct id from mytbl как мы знаем, они генерируют один и тот же план запроса, который неоднократно упоминался.

Я просто использую таблицу, которая имеет более 200 тысяч записей каждая. Мне нужно получить Unique записей, присоединившись к этим таблицам. Какое ключевое слово будет работать быстрее в этом.

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

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

Источник

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

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