MIN/MAX vs ORDENAR POR y LÍMITE

Resuelto nickf asked hace 15 años • 7 respuestas

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;
nickf avatar Jan 09 '09 08:01 nickf
Aceptado

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 SORTy LIMITrequiere 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 SORTyLIMIT 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 SORTyLIMIT 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 SORTand LIMITserí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.

Sean McSomething avatar Jan 09 '2009 01:01 Sean McSomething

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
user650654 avatar Oct 16 '2013 18:10 user650654