Ho due tabelle - incoming tours(id,name)
e incoming_tours_cities(id_parrent, id_city)
bisogno di aiuto nell'ottimizzazione domanda
id
nella prima tabella è unico, e per ogni riga univoco da prima tabella c'è l'elenco dei id_city
- s nella seconda tabella (cioè id_parrent
in seconda tabella è uguale a id
dalla prima tabella)
ad esempio
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-----|
........................
Ciò significa che first_tour
ha elenco di città - ("4","5","27","74")
E second_tour
ha elenco di città - ("1","5")
Supponiamo che io ho due valori - 4
e 74
:
Ora, ho bisogno di ottenere tutte le righe dalla prima tabella, dove i miei valori sono compresi nell'elenco nell'elenco delle città. cioè deve restituire solo il first_tour (perché 4 e 74 sono nella sua lista delle città)
Così, ho scritto la seguente query
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'
e che funziona bene.
Ma io genera la query dinamicamente e quando il conteggio dei join è grande (circa 15) la query rallenta.
vale a dire quando si tenta di eseguire
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'
la query di esecuzione in 45s
(nonostante ho impostato su indici nelle tabelle)
Cosa posso fare, per Optimaze esso?
Grazie mille
ti unisci allo stesso tavolo 14 volte? –
SÌ, perché devo controllare per 14 valori. – Simon
se c'è un altro modo per raggiungere lo stesso effetto, per favore dimmi come questo – Simon