sql >> Base de Datos >  >> RDS >> Mysql

Consulta de rendimiento de MySQL

Se podría pensar que esta consulta solo ejecuta la subconsulta una vez, conserva el resultado y luego lo compara con las filas de la consulta externa. Pero ese no es el caso con MySQL. MySQL tiene una brecha en la inteligencia de su optimizador, por lo que trata la subconsulta como una subconsulta dependiente y lo vuelve a ejecutar para cada valor distinto de la consulta externa.

Para solucionar esto, mueva la subconsulta a la cláusula FROM como una tabla derivada. Ejecutará la subconsulta una vez y mantendrá el resultado como una tabla temporal interna. Luego únase a la otra instancia de la tabla.

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`);

También debe tener un índice de Ciudad sobre las dos columnas (CountryCode,Population) en ese orden, para que la consulta GROUP BY pueda ejecutarse eficientemente.