mysql как оптимизировать order by имея 3 join'a

252
08 февраля 2018, 14:37

СУБД: 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 дней мучений я решил обратиться к мудрейшим.

Answer 1

Помогла команда: 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
READ ALSO
Поиск по id в базе данных и запись значений

Поиск по id в базе данных и запись значений

Здравствуйте, есть таблица prices со столбиками (id, model, name, price, warranty) и таблица orders со столбиками (id, denominations, additional, warr, prices, atotal, ophumber, oname, status, date, uid)

301
Изменить названия фото

Изменить названия фото

есть форма отображения картинки с меткой удалить ли картинку и в поле FORM[photo_rename] - указать новое имя файла картинки

293
Где можно найти информацию по работе с GDAL на C#?

Где можно найти информацию по работе с GDAL на C#?

Можно ли сделать на шарпе что-то подобное написанное на питоне? Пока только смог написать начало на шарпеГде можно найти информацию по работе...

317