Du kan alltid använda EXPLAIN eller EXPLAIN EXTENDED för att se vad MySql gör med en fråga
Du kan också skriva din fråga på något annat sätt, har du provat följande?
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
Det skulle vara intressant att se vad effekten av det är. Jag skulle förvänta mig att det skulle gå snabbare eftersom jag för tillfället tror att MySql kommer att köra inre fråga 1 för varje program du har (så att en fråga kommer att köras många gånger. En anslutning borde vara effektivare.)
Ersätt INNER JOIN med en LEFT JOIN om du vill ha alla program som inte har en rad i show_medias.
EDIT:
Jag ska ta en titt på din EXPLAIN EXTENDED inom kort, jag undrar också om du vill testa följande; det tar bort alla underfrågor:
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
(Det skulle också vara bra att se EXPLAIN Utökad på dessa - du kan lägga till den i kommentarerna för denna).
Ytterligare EDIT:
På din EXPLAIN EXTENDED (en bra start på hur man läser dessa är här )
ANVÄNDA FILESORT och ANVÄNDA TEMPORARY är båda nyckelindikatorer. Förhoppningsvis bör den andra frågan jag rekommenderar ta bort eventuella TILLÄMPLIGA tabeller (i underfrågan). Försök sedan att lämna BESTÄLLNING AV för att se om det gör någon skillnad (och vi kan lägga till det till resultaten hittills :-)
Jag kan också se att frågan potentiellt går miste om många indexuppslagningar; alla dina id-kolumner är främsta kandidater för indexmatchningar (med den vanliga indexförbehåll ). Jag skulle också försöka lägga till dessa index och sedan köra EXPLAIN EXTENDED igen för att se vad skillnaden är nu (EDIT som vi redan vet från din kommentar ovan!)