U kunt altijd EXPLAIN of EXPLAIN EXTENDED gebruiken om te zien wat MySql doet met een query
U kunt uw vraag ook op een iets andere manier schrijven. Heeft u het volgende geprobeerd?
SELECT s.*,
sm.url AS media_url
FROM shows AS s
INNER JOIN show_medias AS sm ON s.id = SM.show_id
WHERE `s`.`id` IN (
SELECT DISTINCT st.show_id
FROM show_time_schedules AS sts
LEFT JOIN show_times AS st ON st.id = sts.show_time_id
WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
)
AND `s`.`is_active` = 1
AND sm.is_primary = 1
ORDER BY s.name asc
Het zou interessant zijn om te zien wat het effect daarvan is. Ik zou verwachten dat het sneller zou zijn, aangezien ik op dit moment denk dat MySql inner query 1 zal uitvoeren voor elke show die je hebt (zodat één query vele malen zal worden uitgevoerd. Een join zou efficiënter moeten zijn.)
Vervang de INNER JOIN door een LEFT JOIN als je alle shows wilt die geen rij hebben in show_medias.
BEWERKEN:
Ik zal binnenkort je EXPLAIN EXTENDED bekijken, ik vraag me ook af of je het volgende wilt proberen; het verwijdert alle subquery's:
SELECT DISTINCT s.*,
sm.url AS media_url
FROM shows AS s
INNER JOIN show_medias AS sm ON s.id = SM.show_id
INNER JOIN show_times AS st ON (s.id = st.show_id)
RIGHT JOIN show_time_schedules AS sts ON (st.id = sts.show_time_id)
WHERE `s`.`is_active` = 1
AND sm.is_primary = 1
AND sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
ORDER BY s.name asc
(Het zou ook goed zijn om de EXPLAIN EXTENDED hierover te zien - je zou het kunnen toevoegen aan de opmerkingen voor deze).
Verdere BEWERKING:
Op uw EXPLAIN EXTENDED (een goed begin met het lezen van deze is hier )
FILESORT GEBRUIKEN en TIJDELIJK GEBRUIKEN zijn beide sleutelindicatoren. Hopelijk moet de tweede query die ik aanbeveel alle TIJDELIJKE tabellen (in de subquery) verwijderen. Probeer dan de ORDER BY uit te laten om te zien of dat een verschil maakt (en we kunnen dat toevoegen aan de bevindingen tot nu toe :-)
Ik kan ook zien dat de query mogelijk veel indexzoekopdrachten misloopt; al uw ID-kolommen zijn hoofdkandidaten voor indexovereenkomsten (met de gebruikelijke indexwaarschuwingen ). Ik zou ook proberen die indexen toe te voegen en dan EXPLAIN EXTENDED opnieuw uit te voeren om te zien wat het verschil nu is (BEWERK zoals we al weten uit je opmerking hierboven!)