Задать вопрос
@dzmitryIhnatau
Backend php developer

Как лучше оптимизировать запрос в базу?

Здравствуйте! Есть такой запрос
select distinct `pfv`.`value_id`
from `products`
    left join `product_filter_value` as `pfv` on `pfv`.`product_id` = `products`.`id`
where `products`.`category_id` = '12'
  and exists (select * from `filter_values` inner join `product_filter_value` on `filter_values`.`id` = `product_filter_value`.`value_id` where `products`.`id` = `product_filter_value`.`product_id` and `filter_values`.`id` in ('4', '5', '6'))
  and exists (select * from `filter_values` inner join `product_filter_value` on `filter_values`.`id` = `product_filter_value`.`value_id` where `products`.`id` = `product_filter_value`.`product_id` and `filter_values`.`id` in ('8', '9', '12', '14', '15', '16'))
  and exists (select * from `filter_values` inner join `product_filter_value` on `filter_values`.`id` = `product_filter_value`.`value_id` where `products`.`id` = `product_filter_value`.`product_id` and `filter_values`.`id` in ('1', '2', '3', '800', '802', '803', '804'))

Можете дать совет как его оптимизировать? Проовал через join но скорость падала
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Есть два дилетантских момента построения БД:
1. Используется строковый тип данных вместо целочисленного на всех полях, где оно используется как идентификатор, (все, что ...id).
Вероятно, второе следствие наивного проектирования БД:
2. На поля, которые участвуют в соединении таблиц или в условии фильтрации через where не предусмотрены индексы. По данному запросу сразу просится проверить наличие или создать индексы на:
`products`.`category_id`, `product_filter_value`.`value_id`, `product_filter_value`.`product_id`.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы