СУБД: mysql percona последней версии
Есть четыре таблицы:
news [id] [date] [text][photo_id]
sections [id] [name]
news_sections [news_id] [section_id]
photos [id] [image]
Имеем запрос который отрабатывает за 0.3 секунды вместо средних 0.03:
select n.*, p.image, s.name from news_sections ns
join news n on (n.id = ns.news_id)
join sections s on (s.id = ns.id)
left join photos p on (n.main_photo_id = p.id)
where ns.id = {id}
order by n.date desc
limit 4
Если убрать order by то запрос отрабатывает быстро Explain говорит что использован filesort на последнем шаге, из-за которого и есть замедление и задержка
Была попытка переписать запрос таким образом, что-бы вместо joina к news был join к отсортированный по date desc уже на момент join'a тоесть:
select n.*, p.image, s.name from news_sections ns
join (select * from news order by date desc) n on (n.id = ns.news_id)
join sections s on (s.id = ns.id)
left join photos p on (n.main_photo_id = p.id)
where ns.id = {id}
limit 4
Explain показал что сортировка прошла, скорость увеличилась, однако после joina новости выдаются в том же порядке что и выдавались без сортировки, тоесть порядок записей в сджойненной таблицы не влияет на общий порядок выдачи.
В инете нашел что все таки можно как-то победить это подзапросами(но мне это не помогло), после 3 дней мучений я решил обратиться к мудрейшим.
Помогла команда: force index(index_name) сам по себе mysql выбирает primary key приоритетней чем любой другой индекс. Запрос стал выглядеть следующим образом:
select n.*, p.image, s.name from news_sections ns
join news n on (n.id = ns.news_id)
force index (date_desc)
join sections s on (s.id = ns.id)
left join photos p on (n.main_photo_id = p.id)
where ns.id = {id}
order by n.date desc
limit 4
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости