8 de febrero de 2013

Ojo a los orders by en MySQL

Aunque MySQL suele ser inteligente, a veces no viene mal ayudarle con los orders. Ejemplo, tabla con muchos municipios, donde queremos obtener unos cuantos haciendo búsqueda por nombre, y luego ordenarlos por capitales y códigos postales ascendentes. La consulta típica sería así:

SELECT m1.id, m1.nombre, m1.codigo_postal, m1.capital
FROM Municipio m1
WHERE m1.nombre LIKE "%Girona%"
ORDER BY m1.capital DESC , m1.codigo_postal ASC

12 total, La consulta tardó 0.5366 seg

Si le echamos una mano a MySQL:

SELECT m2.id AS id, m2.nombre AS nombre, m2.codigo_postal AS codigoPostal, m2.capital
FROM (

SELECT m1.id, m1.nombre, m1.codigo_postal, m1.capital
FROM Municipio m1
WHERE m1.nombre LIKE "%Girona%"
) m2
ORDER BY m2.capital DESC , m2.codigo_postal ASC

12 total, La consulta tardó 0.0886 seg

Parece ser que en algunos casos, como en éste, MySQL tiene a ordenar la tabla antes de realizar la búsqueda, con lo que el resultado es bastante peor.

pd: La prueba está hecha con varios municipios y tras varios reinicios de MySQL. No parece un tema de caché.

No hay comentarios: