Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrageoptimierung - innere Abfragen

Sie können immer EXPLAIN oder EXPLAIN EXTENDED verwenden um zu sehen, was MySql mit einer Abfrage macht

Sie könnten Ihre Abfrage auch etwas anders schreiben, haben Sie Folgendes versucht?

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 

Es wäre interessant zu sehen, welche Auswirkungen das hat. Ich würde erwarten, dass es schneller geht, da ich im Moment denke, dass MySql die innere Abfrage 1 für jede Show ausführen wird, die Sie haben (so dass eine Abfrage viele Male ausgeführt wird. Ein Join sollte effizienter sein.)

Ersetzen Sie den INNER JOIN durch einen LEFT JOIN, wenn Sie alle Shows haben möchten, die keine Zeile in show_medias haben.

BEARBEITEN:

Ich werde mir in Kürze Ihren EXPLAIN EXTENDED ansehen. Ich frage mich auch, ob Sie Folgendes versuchen möchten. es entfernt alle Unterabfragen:

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 

(Es wäre auch gut, das EXPLAIN EXTENDED auf diesen zu sehen - Sie könnten es zu den Kommentaren für dieses hinzufügen).

Weitere EDIT:

Auf Ihrem EXPLAIN EXTENDED ( ein guter Anfang, wie man diese liest ist hier )

Sowohl USING FILESORT als auch USING TEMPORARY sind Schlüsselindikatoren. Hoffentlich sollte die zweite von mir empfohlene Abfrage alle TEMPORARY-Tabellen (in der Unterabfrage) entfernen. Versuchen Sie dann, ORDER BY aus zu lassen, um zu sehen, ob das einen Unterschied macht (und wir können das zu den bisherigen Ergebnissen hinzufügen :-)

Ich kann auch sehen, dass der Abfrage möglicherweise viele Indexsuchen entgehen; alle Ihre ID-Spalten sind Hauptkandidaten für Indexübereinstimmungen (mit dem üblichen Vorbehalte bei Indexen ). Ich würde auch versuchen, diese Indizes hinzuzufügen und dann EXPLAIN EXTENDED erneut auszuführen, um zu sehen, was jetzt der Unterschied ist (BEARBEITEN, wie wir bereits aus Ihrem obigen Kommentar wissen!)