Итак, имеем таблицу постов некоего форума (~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 выдает одинаковый результат для обоих запросов:
По-видимому, 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
Очередной бессмысленный комментарий. Что такое `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
Спустя 1 час, 49 минут, 1 секунда (4.04.2011 - 03:42) inpost написал(а):
Guest
Если ты не понял, что я написал, это говорит совсем о другом, мне тебя жаль, если ты не понимаешь этого.
Хочешь показаться умным, где анализ ключей, где проведённый анализ по одному полю, по нескольким, по разным, к тому же твой запрос не кешируется, + всего 900 записей фиксировано.
И ещё, что это ещё за такие еврейские тупости в первой строке? Я же не называю евреев жидами, хотя они такими и являются, так же не называю секретарш - секретутками, имей уважение к национальности, вероисповеданию и профессии, это как предупреждение, так как в данном контексте твои слова звучат оскорбительно!
Ещё и поиск по VARCHAR(255), это уже слишком
Если ты не понял, что я написал, это говорит совсем о другом, мне тебя жаль, если ты не понимаешь этого.
Хочешь показаться умным, где анализ ключей, где проведённый анализ по одному полю, по нескольким, по разным, к тому же твой запрос не кешируется, + всего 900 записей фиксировано.
И ещё, что это ещё за такие еврейские тупости в первой строке? Я же не называю евреев жидами, хотя они такими и являются, так же не называю секретарш - секретутками, имей уважение к национальности, вероисповеданию и профессии, это как предупреждение, так как в данном контексте твои слова звучат оскорбительно!
Ещё и поиск по VARCHAR(255), это уже слишком
Спустя 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) |
Ну так если точно такие же, то значит и не кешируются, разве нет? |
Спустя 9 минут, 22 секунды (4.04.2011 - 04:46) inpost написал(а):
Guest
DISTINCT существует для того, чтобы делать всю строку уникальной, если достаётся 1 поле, то DISTINCT будет быстрее, потому что ради этого и создали эту команду.
GROUP BY создан совсем для других целей, как показал я вторым запросом, что он создан как раз для группировки 1 или нескольких полей при выборе множественных полей, а не полностью уникальную запись.
Твоя тема из разряда: "смотрите, если я использую функцию, которая создана для этих целей - то всё быстро, если я пользуюсь функцией (командой) через задницу левой, предназначения которой совсем другие - то медленнее". Приветствую тебя Капитан Очевидность
DISTINCT существует для того, чтобы делать всю строку уникальной, если достаётся 1 поле, то DISTINCT будет быстрее, потому что ради этого и создали эту команду.
GROUP BY создан совсем для других целей, как показал я вторым запросом, что он создан как раз для группировки 1 или нескольких полей при выборе множественных полей, а не полностью уникальную запись.
Твоя тема из разряда: "смотрите, если я использую функцию, которая создана для этих целей - то всё быстро, если я пользуюсь функцией (командой) через задницу левой, предназначения которой совсем другие - то медленнее". Приветствую тебя Капитан Очевидность
Спустя 6 минут, 41 секунда (4.04.2011 - 04:53) kirik написал(а):
inpost
Дело в том, что в мане-то написано обратное.. Грубо говоря пишут что DISTINCT использует GROUP BY, а следовательно и "процессинг" запросов получается идентичный. На деле получается что это не так..
Чтож, всем спасибо! Бум знать)
Дело в том, что в мане-то написано обратное.. Грубо говоря пишут что DISTINCT использует GROUP BY, а следовательно и "процессинг" запросов получается идентичный. На деле получается что это не так..
Чтож, всем спасибо! Бум знать)
Спустя 3 минуты, 3 секунды (4.04.2011 - 04:56) inpost написал(а):
kirik
Значит опечатка в мануале, логика же остаётся, голова для этого и сидит на плечах
Значит опечатка в мануале, логика же остаётся, голова для этого и сидит на плечах
Спустя 4 минуты, 20 секунд (4.04.2011 - 05:00) kirik написал(а):
Цитата (inpost @ 3.04.2011 - 20:56) |
Значит опечатка в мануале |
Ты подорвал моё доверие к манам)
Цитата (inpost @ 3.04.2011 - 20:56) |
голова для этого и сидит на плечах |
А есть в куда??
Спустя 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" выдаст ошибку)
*Я люблю твороженные булочки*
Для твоего сведения, 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 ? Что скрываешься под анонимами?
Ты 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, кстати, вроде успел увидеть парочку, так что может подтвердить...
Кстати, а Эксперты являются модераторами ?
Во-первых, я не qpayct.
В-третьих, я не использовал ни одного матерного слова ни в одном их своих постов.
Готов в подтверждение выслать любому желающему полные тексты потертых и исправленых постов. kirik, кстати, вроде успел увидеть парочку, так что может подтвердить...
Кстати, а Эксперты являются модераторами ?
Спустя 1 час, 41 минута, 52 секунды (4.04.2011 - 13:30) Michael написал(а):
Цитата |
Кстати, а Эксперты являются модераторами ? |
угу
Спустя 6 месяцев, 20 дней, 22 часа, 8 минут, 42 секунды (25.10.2011 - 11:39) yahonto написал(а):
>> Ну так если точно такие же, то значит и не кешируются, разве нет?
не факт
> Хз, они могут и с SQL_NO_CACHE кэшироваться
SQL_NO_CACHE это инструкция, которая позволяет не кешировать результат запроса, в котором она используется. Однако если кеш уже существует и данные не поменялись, то существующий кеш для того же запроса будет использоваться с SQL_NO_CACHE все равно.
Чтоб сравнивать без кеша нужно заново создать таблицы и проводить тест с SQL_NO_CACHE во всех запросах.
не факт
> Хз, они могут и с SQL_NO_CACHE кэшироваться
SQL_NO_CACHE это инструкция, которая позволяет не кешировать результат запроса, в котором она используется. Однако если кеш уже существует и данные не поменялись, то существующий кеш для того же запроса будет использоваться с SQL_NO_CACHE все равно.
Чтоб сравнивать без кеша нужно заново создать таблицы и проводить тест с SQL_NO_CACHE во всех запросах.