Данный SQL запрос имеет различные модификации в коде, но суть одна - он работает на вывод объявлений, с информацией о категории и региональности.
Для наглядности покажу изображение:
Вот сам запрос. В нем нет ничего сложного, это JOIN на несколько таблиц и условия в WHERE:
explain SELECT STRAIGHT_JOIN *
FROM `advert`
INNER JOIN `user-country` ON `advert`.`advert_place_country` = `user-country`.`id`
INNER JOIN `user-region` ON `advert`.`advert_place_region` = `user-region`.`id`
INNER JOIN `user-city` ON `advert`.`advert_place_city` = `user-city`.`id`
INNER JOIN `user` ON `user`.`id` = `advert`.`advert_id_user`
INNER JOIN `category` ON `advert`.`advert_category` = `category`.`id`
WHERE
`advert_active` = 1
AND `advert`.`advert_payment` = 1
AND `advert_place_country` = 3159
AND `user`.`user_active` = 1
ORDER BY
`advert`.`advert_create_date`
DESC
LIMIT 0, 80
Вот explain:
Меня не устраивает время обработки запроса в 0.2 - 0.3 секунды и кол-во затрагиваемых строк. Индекс такой:
`findListForCatalog` (
`advert_active`,
`advert_payment`,
`advert_place_country`,
`advert_place_region`, // в данном запросе не используется
`advert_place_city` // в данном запросе не используется
)
Сейчас начинаю думать о денормализации данных и создавать триггеры, который будут текстовую информацию региональности и категории (Имя категории, Имя города, региона и страны) писать в таблицу объявлений advert. Таблица разрастется в разы, но иного способа я сейчас уже просто не вижу, перепробовал кучу вариантов. В таблице всего 20 000 записей, но время работы в 0.3 меня совсем не устраивает.