SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 26.03.2019 14:43:50

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

8.0.15 row_number() медленней пользовательских переменных

Интуитивно полагал, что встроенная реализация должна быть быстрее, чем нагромождение вычислений с помощью переменных. 2 строки explain против 4 smile
Однако, опыт показывает обратное.
Таблица постов на ~16 000 записей, равномерно распределенных среди 20 юзеров.

create table posts (post_id int, user_id int, date_added timestamp, post_text text, primary key (id), unique (user_id,date_added));

Найти 3 последних поста каждого юзера.

1. row_number() (среднее время выполнения 0.15)

select post_id, user_id, date_added, post_text from
(select posts.*,row_number() over (partition by user_id order by date_added desc) i from posts) t
where i <= 3;

2. пользовательские переменные (среднее время выполнения 0.12)

select post_id, user_id, date_added, post_text from
(select posts.*, if(@gr=user_id, @i:=@i+1, @i:=1 + least(@gr:=user_id,0)) x from posts, (select @i:=0, @gr:=0) t order by user_id, date_added desc) t1
where x <=3;


Это такая кривая реализация или я неправильно их готовлю?

Неактивен

 

#2 26.03.2019 15:19:06

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

Re: 8.0.15 row_number() медленней пользовательских переменных

Разница небольшая, но все равно неожиданно. В первом запросе индекс по полю  date_added MySQL использует?

Неактивен

 

#3 26.03.2019 15:48:29

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

Re: 8.0.15 row_number() медленней пользовательских переменных

1. не такая уж и маленькая, всё-таки не единицы процентов
2. да
"name": "<unnamed window>",
                "using_filesort": true,
                "filesort_key": [
                  "`user_id`",
                  "`date_added` desc"
                ],

Неактивен

 

#4 26.03.2019 19:08:28

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

Re: 8.0.15 row_number() медленней пользовательских переменных

Тогда вывод: оконные функции нужно использовать проверив другие варианты.
Какая версия севера?

Неактивен

 

#5 27.03.2019 13:26:25

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

Re: 8.0.15 row_number() медленней пользовательских переменных

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

8.0.15

Неактивен

 

Board footer

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