У меня есть две таблицы - incoming tours(id,name)
и incoming_tours_cities(id_parrent, id_city)
Нужна помощь в оптимизации запроса
id
в первой таблице является уникальным, и для каждой уникальной строки из первой таблицы есть список id_city
- s во второй таблице (т.е. id_parrent
в вторая таблица равна id
из первой таблицы)
Например
incoming_tours
|--id--|------name-----|
|---1--|---first_tour--|
|---2--|--second_tour--|
|---3--|--thirth_tour--|
|---4--|--hourth_tour--|
incoming_tours_cities
|-id_parrent-|-id_city-|
|------1-----|---4-----|
|------1-----|---5-----|
|------1-----|---27----|
|------1-----|---74----|
|------2-----|---1-----|
|------2-----|---5-----|
........................
Это означает, что first_tour
имеет список городов - ("4","5","27","74")
И second_tour
имеет список городов - ("1","5")
Давайте предположим, что у меня есть два значения - 4
и 74
:
Теперь мне нужно получить все строки из первой таблицы, где мои значения указаны в списке городов. то есть он должен вернуть только first_tour (потому что 4 и 74 в этом список городов)
Итак, я написал следующий запрос
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
И это прекрасно работает.
Но я генерирую запрос динамически, и когда количество объединений велико (около 15), запрос замедляется.
т.е. когда я пытаюсь запустить
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
.........................................................
JOIN `incoming_tours_cities` tc15 ON tc15.id_parrent = t.id
AND tc15.id_city = 'some_value'
запроса протекание в 45s
(несмотря на я установить индексы в таблицах)
Что я могу сделать, чтобы optimaze это?
Большое спасибо
Вы присоединяетесь к одной и той же таблице 14 раз? –
ДА, потому что я должен проверить 14 значений. – Simon
Если есть другой способ достичь такого же эффекта, скажите, пожалуйста, как – Simon