SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 02.04.2019 16:54:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Выбрать несколько записей из каждой группы - новая статья на sqlinfo

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

-) Неожиданно, хорошую эффективность показал трюк с group_concat.

-) Была надежда на with recursive, но из-за ограничений (ссылка на cte только во from; нельзя group by, order by, limit) получается удручающая производительность. Не стал включать в список.


Прикрепленные файлы:
Attachment Icon trace.sql, Размер: 45,479 байт, Скачано: 1,100

Неактивен

 

#2 02.04.2019 17:07:51

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Спасибо за проделанную работу!
Особенно заинтересовало использование lateral.

Неактивен

 

#3 02.04.2019 17:08:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Спасибо! Очень полный обзор. Думаю, что with recursive стоит добавить для академической полноты. Статью можно добавить в FAQ.

Неактивен

 

#4 02.04.2019 19:52:10

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

vasya, отличная статья!
А ты постил на bugs.mysql.com про 6-й пункт (lateral)?
Интересно, что они думают.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 04.04.2019 11:49:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

deadka, хорошая мысль, добавил 
http://bugs.mysql.com/94903

Неактивен

 

#6 04.04.2019 13:47:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Будем подождать реакции!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 04.04.2019 15:28:15

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Почему JSON файл сохранен как SQL?
https://sqlinfo.ru/forum/attachment.php?item=671

Неактивен

 

#8 05.04.2019 08:41:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

на автопилоте (когда писал dumpfile, вероятно по аналогии с mysqldump, который делает sql файл) указал такое расширение

Неактивен

 

#9 08.04.2019 11:53:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Гильям Бишот рекомендовал расширить выражение сортировки:
вместо
order by date_added desc limit 3
указать
order by user_id desc, date_added desc limit 3
Тогда MySQL будет использовать индекс. Новый вариант выполняется в 3 раза быстрее.

Внес дополнения в статью.

На баг репорте ленятся (запрашивают доп информацию вместо того, чтобы воспроизвести у себя).

Неактивен

 

#10 09.04.2019 11:02:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Запросить доп. информацию - работа сервисного инженера ресепшена. Bishot все понял правильно, так как знает про внутреннее устройство.

Неактивен

 

#11 09.04.2019 11:17:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Имхо, это должно быть в случае, когда сотрудник не может воспроизвести проблему. Ответы в стиле "попробуйте force index" или "другие подсказки оптимизатору, описанные в нашей документации" мне кажутся не уместными.
Тут, конечно, ещё проблема в том, что я пишу на "албанском" английском из-за чего может возникать недопонимание.
Насколько легче общаться когда с той стороны человек с типичной англо-саксонской фамилией типа "петренко" smile

Проблема оказалась не в реализации lateral, а шире - оптимизатор не трактует внешнюю ссылку как константу. Странно, что раньше это не обнаружили.

Неактивен

 

#12 03.01.2021 00:09:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выбрать несколько записей из каждой группы - новая статья на sqlinfo

Для второго метода интересна проблема с ONLY_FULL_GROUP_BY.

Простое перечисление всех полей в части group by в разы увеличивает время выполнения запроса.

А что получится по производительности, если в части FROM вместо * перечислить все поля с аггрегирующей функцией, например MIN()?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson