sql >> Databasteknik >  >> RDS >> Mysql

MySQL Query Optimization - inre frågor

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!)



  1. MySQL:Kan du ange en slumpmässig gräns?

  2. Stöder MySql sp_getapplock

  3. Hur man visar en bild från en mysql blob

  4. Nackdelar med att lagra ett heltal som en sträng i en databas