sql >> Database >  >> RDS >> Mysql

MySQL-queryoptimalisatie - innerlijke query's

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



  1. Dimensies van dimensies:een blik op de meest voorkomende dimensionale tabeltypen van datawarehousing

  2. Statische en dynamische gegevensmaskering in FieldShield

  3. Sqlalchemy bulk-update in MySQL werkt erg traag

  4. Combineer meerdere SELECT-instructies