[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: DISTINCT vs GROUP BY
Guest
Наверное многие тут слышали, что "DISTINCT - это особый случай GROUP BY". С этим в принципе согласен и мануал: "In most cases, a DISTINCT clause can be considered as a special case of GROUP BY." Многие "оптимизаторы" и тут и на Хабре рекомендуют использовать GROUP BY вместо DISTINCT везде где возможно. Однако, как показывает жизнь, фокус удается не всегда.

Итак, имеем таблицу постов некоего форума (~140.000 записей):
`postID` MEDIUMINT(8) PRIMARY KEY
`topicID` MEDIUMINT(8) INDEX
`postTitle` VARCHAR(255)

Задача: найти все топики у которых хотя бы в одном из постов в заголовке есть слово "blabla".

SELECT `topicID` FROM `forum_posts` WHERE `postTitle` LIKE '%blabla%' GROUP BY `topicID` ORDER BY `postID` DESC
(918 всего, запрос занял 0.4379 сек.)


SELECT DISTINCT `topicID` FROM `forum_posts` WHERE `postTitle` LIKE '%blabla%' ORDER BY `postID` DESC
(918 всего, запрос занял 0.0373 сек.)

DISTINCT быстрее в 12 раз!

EXPLAIN выдает одинаковый результат для обоих запросов:
user posted image

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

Вобщем хотелось бы услышать мнение экспертов :)



Спустя 4 минуты, 35 секунд (4.04.2011 - 01:16) inpost написал(а):
Guest
SELECT `topicID`,`topicID2` FROM `forum_posts` WHERE `postTitle` LIKE '%blabla%' GROUP BY `topicID` ORDER BY `postID` DESC

SELECT DISTINCT `topicID`,`topicID2` FROM `forum_posts` WHERE `postTitle` LIKE '%blabla%' ORDER BY `postID` DESC

Смотри разницу, всё поймешь, это имеет разные применения когда разные запросы

Спустя 4 минуты, 40 секунд (4.04.2011 - 01:20) Invis1ble написал(а):
Guest
Не могу себя назвать экспертом, но знаю одно точно: большое значение имеет движок таблицы, в разных движках запросы по разному обрабатываются.

Спустя 32 минуты, 23 секунды (4.04.2011 - 01:53) Guest написал(а):
inpost, я люблю твороженные булочки

Очередной бессмысленный комментарий. Что такое `topicID2`? Что я должен увидеть? Какая вообще связь между твоими запросами и моими? Ты пытаешься мне показать, что DISTINCT по двум полям и GROUP BY - по одному, дадут разные результаты? Спасибо, я это знаю.

Предыдущим постом я пытался сделать две вещи:
1) показать, что GROUP BY не всегда быстрее DISTINCT'a по тем же полям, как это часто утверждается (например тут: http://phpforum.ru/index.php?showtopic=38999)
2) понять, ПОЧЕМУ он не быстрее, если DISTINCT это его частный случай.

(специально для inpost'a: согласно мануалу "DISTINCT a, b, c" полностью эквивалентен "GROUP BY a, b, c", и это именно то что написано у меня в запросах, и совсем не то что написано у тебя)


Invis1ble, таблица стандартная MyISAM

sergeiss, БД - MySQL smile.gif

Спустя 1 час, 49 минут, 1 секунда (4.04.2011 - 03:42) inpost написал(а):
Guest
Если ты не понял, что я написал, это говорит совсем о другом, мне тебя жаль, если ты не понимаешь этого.
Хочешь показаться умным, где анализ ключей, где проведённый анализ по одному полю, по нескольким, по разным, к тому же твой запрос не кешируется, + всего 900 записей фиксировано.
И ещё, что это ещё за такие еврейские тупости в первой строке? Я же не называю евреев жидами, хотя они такими и являются, так же не называю секретарш - секретутками, имей уважение к национальности, вероисповеданию и профессии, это как предупреждение, так как в данном контексте твои слова звучат оскорбительно!
Ещё и поиск по VARCHAR(255), это уже слишком smile.gif

Спустя 38 минут, 15 секунд (4.04.2011 - 04:20) kirik написал(а):
Цитата (inpost @ 3.04.2011 - 19:42)
Ещё и поиск по VARCHAR(255), это уже слишком

Почему?

Цитата (inpost @ 3.04.2011 - 19:42)
к тому же твой запрос не кешируется

Наоборот, кэшируется.
Guest
Добавьте SQL_NO_CACHE к каждому запросу, каковы будут результаты?

Спустя 1 минута, 10 секунд (4.04.2011 - 04:21) Guest написал(а):

 ! 

М
Масса оскорблений!
inpost

Спустя 1 минута, 29 секунд (4.04.2011 - 04:23) Guest написал(а):
kirik, добавил - точно такие же.

Спустя 9 минут, 6 секунд (4.04.2011 - 04:32) inpost написал(а):
kirik
Ну так если точно такие же, то значит и не кешируются, разве нет?

Спустя 50 секунд (4.04.2011 - 04:33) kirik написал(а):
Цитата (Guest @ 3.04.2011 - 20:23)
добавил - точно такие же

Проверил на своей таблице (31к записей). Без сортировки DISTINCT в 2 раза быстрее GROUP BY, если с сортировкой, то примерно одинаково.

Спустя 4 минуты, 12 секунд (4.04.2011 - 04:37) kirik написал(а):
Цитата (inpost @ 3.04.2011 - 20:32)
Ну так если точно такие же, то значит и не кешируются, разве нет?

Хз, они могут и с SQL_NO_CACHE кэшироваться smile.gif

Нашел тут по теме.

Спустя 9 минут, 22 секунды (4.04.2011 - 04:46) inpost написал(а):
Guest
DISTINCT существует для того, чтобы делать всю строку уникальной, если достаётся 1 поле, то DISTINCT будет быстрее, потому что ради этого и создали эту команду.
GROUP BY создан совсем для других целей, как показал я вторым запросом, что он создан как раз для группировки 1 или нескольких полей при выборе множественных полей, а не полностью уникальную запись.

Твоя тема из разряда: "смотрите, если я использую функцию, которая создана для этих целей - то всё быстро, если я пользуюсь функцией (командой) через задницу левой, предназначения которой совсем другие - то медленнее". Приветствую тебя Капитан Очевидность smile.gif

Спустя 6 минут, 41 секунда (4.04.2011 - 04:53) kirik написал(а):
inpost
Дело в том, что в мане-то написано обратное.. Грубо говоря пишут что DISTINCT использует GROUP BY, а следовательно и "процессинг" запросов получается идентичный. На деле получается что это не так..
Чтож, всем спасибо! Бум знать)

Спустя 3 минуты, 3 секунды (4.04.2011 - 04:56) inpost написал(а):
kirik
Значит опечатка в мануале, логика же остаётся, голова для этого и сидит на плечах smile.gif

Спустя 4 минуты, 20 секунд (4.04.2011 - 05:00) kirik написал(а):
Цитата (inpost @ 3.04.2011 - 20:56)
Значит опечатка в мануале

Ты подорвал моё доверие к манам)

Цитата (inpost @ 3.04.2011 - 20:56)
голова для этого и сидит на плечах

А есть в куда?? smile.gif

Спустя 7 минут, 3 секунды (4.04.2011 - 05:07) Guest написал(а):
kirik, хм, интересно, пасиб... т.е. получается DISTINCT все таки в тихушку использует индекс в дополнение к сортировке по PRIMARY

*Я люблю твороженные булочки*

Для твоего сведения, DISTINCT является модификатором языка SQL, которым пользуются большинство современных БД, а не "командой специально сделаной для..." в MySQL. kirik тебе уже написал про мануал мускуля (я, кстати, в первом после дал ссылку на него, но ты, разумеется, даже не подумал туда заглянуть).

Кроме того, sergeiss может тебе рассказать, что в Постгре DISTINCT можно сажать на отдельные поля, а не на весь запрос, а я могу добавить, что в MSSQL (и кажется Oracle), нельзя делать GROUP BY по части выбраных полей, без аггрегатных функций. (например: "SELECT a, b, c FROM Table GROUP BY a, b" выдаст ошибку)

Спустя 9 минут, 49 секунд (4.04.2011 - 05:17) inpost написал(а):
Guest
Ты qpayct ? Что скрываешься под анонимами?

Спустя 30 минут, 56 секунд (4.04.2011 - 05:48) glock18 написал(а):
inpost
угомонись, не наезжай на человека, он целиком и полностью правильно сформулировал первый пост, а вот твой ответ был не совсем в тему.

Спустя 11 минут, 37 секунд (4.04.2011 - 06:00) inpost написал(а):
glock18
Это повод для прямых оскорблений? Ты посмотри сколько я затёр начиная от "умалишенного", до прямых матов.
Разве не в тему? Помоему даже в тему, я в последующем комментарии дал более развернутый ответ. Хотя оскорбления начали поступать ещё до развернутого ответа.

Спустя 5 часов, 48 минут, 11 секунд (4.04.2011 - 11:48) Guest написал(а):
inpost, много-много пустых слов...

Во-первых, я не qpayct.
В-третьих, я не использовал ни одного матерного слова ни в одном их своих постов.

Готов в подтверждение выслать любому желающему полные тексты потертых и исправленых постов. kirik, кстати, вроде успел увидеть парочку, так что может подтвердить...

Кстати, а Эксперты являются модераторами ?

Спустя 1 час, 41 минута, 52 секунды (4.04.2011 - 13:30) Michael написал(а):
Цитата
Кстати, а Эксперты являются модераторами ?

угу wink.gif

Спустя 6 месяцев, 20 дней, 22 часа, 8 минут, 42 секунды (25.10.2011 - 11:39) yahonto написал(а):
>> Ну так если точно такие же, то значит и не кешируются, разве нет?

не факт

> Хз, они могут и с SQL_NO_CACHE кэшироваться

SQL_NO_CACHE это инструкция, которая позволяет не кешировать результат запроса, в котором она используется. Однако если кеш уже существует и данные не поменялись, то существующий кеш для того же запроса будет использоваться с SQL_NO_CACHE все равно.
Чтоб сравнивать без кеша нужно заново создать таблицы и проводить тест с SQL_NO_CACHE во всех запросах.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.