Задать вопрос

Медленная сортировка по дате в Mysql

имеется медленный запрос (для 30к постов и 30к юзеров выполняется за 0.2с):

SELECT *
FROM `posts`
JOIN `users` ON ( `posts`.`user_id` = `users`.`id` )
GROUP BY `posts`.`id`
ORDER BY `posts`.`date` DESC
LIMIT 10

описывать стуктуру таблиц не буду полностью, т.к. полей много а на суть вопроса это не влияет, опишу основное — date типа datetime, ID типа int

праймери индексы на posts.id и users.id + индекс на posts.user_id

при таком раскладе запрос выполняется за 0.2с

если поставить индекс на date запрос выполняется все равно за 0.2с
если поставить сортировку по posts.id (что в принципе эквивалентно date), запрос выполняется за 0.001с
если убрать JOIN users запрос выполняется за 0.001с

explain:

без индекса на posts.date, время 0.2с

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index user_id PRIMARY 4 NULL 1000 Using where; Using temporary; Using filesort
1 SIMPLE users eq_ref PRIMARY PRIMARY 3 db_site.posts.user_id 1 Using where


с индексом на posts.date, время 0.2с

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index user_id date 8 NULL 1000 Using where; Using temporary
1 SIMPLE users eq_ref PRIMARY PRIMARY 3 db_site.posts.user_id 1 Using where


без сортировки по posts.date, время 0.001с

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index user_id PRIMARY 4 NULL 1000 Using where
1 SIMPLE users eq_ref PRIMARY PRIMARY 3 db_site.posts.user_id 1 Using where


а теперь внимание, вопрос — как сделать сортировку по дате быстрой? и что я делаю не так…
  • Вопрос задан
  • 4274 просмотра
Подписаться 6 Оценить Комментировать
Решения вопроса 1
@rvsob
Уберите GROUP BY `posts`.`id`
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
JeanLouis
@JeanLouis
Попробуйте составной индекс (posts.id, posts.date).
Ответ написан
taliban
@taliban
php программист
Я бы на Вашем месте изменил бы структуру страницы posts. На сколько я понимаю табличка users Вам нужна для отображения имени автора поста, я бы добавил в табличку posts нужные поля ( имя автора, может рейтинг поста, нужные в общем), и не соединял бы остальные таблички, но в таким случае нужно при обновлении других таблиц смотреть и посты. Работать будет в разы быстрей, но внимания нужно будет тоже больше уделить изменениям.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект