Mysql
 sql >> Database >  >> RDS >> Mysql

Query sulle prestazioni di MySQL

Si potrebbe pensare che questa query esegua la sottoquery solo una volta, mantenga il risultato e quindi lo confronti con le righe nella query esterna. Ma non è il caso di MySQL. MySQL ha una lacuna nell'intelligenza del suo ottimizzatore, quindi tratta la sottoquery come una sottoquery dipendente e lo riesegue per ogni valore distinto della query esterna.

Per risolvere questo problema, sposta la sottoquery nella clausola FROM come tabella derivata. Eseguirà la sottoquery una volta e manterrà il risultato come tabella temporanea interna. Quindi unisciti all'altra istanza della tabella.

SELECT `ID`, `CountryCode`, `Name`, `District`, `Population`
FROM `City`
JOIN (
    SELECT `CountryCode`, MAX(`Population`) AS `Population`
    FROM `City`
    GROUP BY `CountryCode`
) AS _max USING (`CountryCode`, `Population`);

Inoltre dovresti avere un indice su Città sulle due colonne (CountryCode,Population) in quest'ordine, in modo che la query GROUP BY possa essere eseguita in modo efficiente.