Я работаю со старой схемой базы данных, которая выглядит следующим образом:
product_table
таблица содержит поля:
uid
(int, первичный ключ)
name
(varchar 50)
category
таблица содержит поля:
uid
(int, первичный ключ)
name
(Варчар 50)
<ч />
Хорошо, теперь product_table
имеет 4 ММ отношения с таблицей категорий:
product_table__category_1__mm
имеет поля:
uid_local
(int, содержит product_table.uid
)
uid_foreign
(int, содержит category.uid
)
product_table__category_2__mm
имеет поля:
uid_local
(int, содержит product_table.uid
)
uid_foreign
(int, содержит category.uid
)
product_table__category_3__mm
имеет поля:
uid_local
(int, содержит product_table.uid
)
uid_foreign
(int, содержит category.uid
)
product_table__category_4__mm
имеет поля:
uid_local
(int, содержит product_table.uid
)
uid_foreign
(int, содержит category.uid
)
(да, все таблицы 4 ММ имеют одинаковые поля и все относятся к таблице category
)
<ч />
Итак, если я хочу получить все четыре соединения и отфильтровать их по значениям int, выбранным пользователем, это будет выглядеть примерно так:
select
product_table.*
from
product_table
inner join product_table__category_1__mm mm_1 on mm_1.uid_local = product_table.uid
inner join category cat_1 on cat_1.uid = mm_1.uid_foreign and cat_1.uid in (7, 8)
inner join product_table__category_2__mm mm_2 on mm_2.uid_local = product_table.uid
inner join category cat_2 on cat_2.uid = mm_2.uid_foreign and cat_2.uid in (63, 52)
inner join product_table__category_3__mm mm_3 on mm_3.uid_local = product_table.uid
inner join category cat_3 on cat_3.uid = mm_3.uid_foreign and cat_3.uid in (84, 12)
inner join product_table__category_4__mm mm_4 on mm_4.uid_local = product_table.uid
inner join category cat_4 on cat_4.uid = mm_4.uid_foreign and cat_4.uid in (16, 33)
group by product_table.uid ### --> in order to get unique results
Теперь это большой запрос, но я не могу изменить дизайн БД, так как он уже широко используется.
Есть идеи, как сделать этот запрос быстрее? Где бы вы положили индексы?