MIN/MAX vs ORDENAR POR y LÍMITE
De las siguientes consultas, ¿qué método consideraría mejor? ¿Cuáles son sus razones (eficiencia del código, mejor mantenibilidad, menos WTFery)...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
En el peor de los casos, cuando estás viendo un campo no indexado, el uso MIN()
requiere una sola pasada completa de la tabla. Usar SORT
y LIMIT
requiere una clasificación de archivos. Si se compara con una mesa grande, probablemente habría una diferencia significativa en el rendimiento percibido. Como dato anecdótico, MIN()
tomó .36 mientras SORT
yLIMIT
0,84 segundos en una tabla de 106.000 filas en mi servidor de desarrollo.
Sin embargo, si está mirando una columna indexada, la diferencia es más difícil de notar (el punto de datos sin sentido es 0,00 s en ambos casos). Sin embargo, al observar el resultado de explicación, parece que es MIN()
capaz de simplemente extraer el valor más pequeño del índice (las filas 'Seleccionar tablas optimizadas' y 'NULL'), mientras que SORT
yLIMIT
necesita realizar un recorrido ordenado del índice. (106.000 filas). El impacto real en el rendimiento probablemente sea insignificante.
Parece que MIN()
es el camino a seguir: es más rápido en el peor de los casos, indistinguible en el mejor de los casos, es SQL estándar y expresa más claramente el valor que está tratando de obtener. El único caso en el que parece deseable usar SORT
and LIMIT
sería, como mencionó mson , cuando se escribe una operación general que encuentra los N valores superiores o inferiores de columnas arbitrarias y no vale la pena escribir la operación de caso especial.
Como han señalado mson y Sean McSomething , es preferible MIN.
Otra razón por la que ORDER BY + LIMIT es útil es si desea obtener el valor de una columna diferente a la columna MIN.
Ejemplo:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1