Come posso ottimizzare questa query?
Domanda
Come posso ottimizzare questa query? Sembra che ci dovrebbe essere un modo molto più semplice per farlo. L'obiettivo è che sarà ancora possibile trasformarlo prontamente in una dichiarazione di eliminazione.
SELECT * FROM team
WHERE team_id IN (
SELECT team_id
FROM (
SELECT team.team_id, (
SELECT COUNT(*)
FROM signup
WHERE signup.team_id = team.team_id
) AS members
FROM team, schedule, event
WHERE team.schedule_id = schedule.schedule_id
AND schedule.event_id = event.event_id
AND event.event_id =183) AS t
WHERE members = 0
)
Soluzione
Un rapido sguardo a questa query mi dà questo:
select
t.*
from
team t
inner join schedule s on t.schedule_id = s.schedule_id
inner join event e on s.event_id = e.event_id
left outer join signup sp on t.team_id = sp.team_id
where
e.event_id = 183
and sp.team_id is null
Sembra che tu stia cercando di trovare tutti i team che si trovano in un evento ma non sono presenti nella tabella di iscrizione. È accurato?
Inoltre, desidero notare che sarà più veloce fare join rispetto a un sacco di subquery, specialmente se le subquery dipendono da ogni riga (nel tuo caso, lo fanno).
Saluti,
Eric
Altri suggerimenti
Commentando la query di Eric in questo thread, consiglierei (dal mio background di mssqlserver) di usare invece un controllo esistenziale. In questo modo (1) rendi più chiaro il tuo intento e (2) dà all'ottimizzatore l'opportunità di interrompere l'esame per un team_id corrispondente dopo che il primo è stato trovato (poiché > = 1 riga corrispondente causa un controllo esistenziale falso). Per es.
selezionare t. * a partire dal squadra t pianificazione join interno s su t.schedule_id = s.schedule_id evento join interno e su s.event_id = e.event_id dove e.event_id = 183 e non esiste (selezionare * dall'iscrizione dove team_id = t.team_id)
Ma forse ci sono preoccupazioni perf specifiche per mysql.