2009-01-09 42 views
65

De las siguientes consultas, ¿qué método consideraría el mejor? ¿Cuáles son sus razones (eficiencia de código, una mejor capacidad de mantenimiento, menos WTFery) ...MIN/MAX vs ORDER BY y LIMIT

SELECT MIN(`field`) 
FROM `tbl`; 

SELECT `field` 
FROM `tbl` 
ORDER BY `field` 
LIMIT 1; 

Respuesta

90

En el peor de los casos, cuando usted está buscando en un campo no indexado, utilizando MIN() requiere una única completa pase de la mesa El uso de SORT y LIMIT requiere una clasificación de archivo. Si se ejecuta contra una tabla grande, es probable que haya una diferencia significativa en el rendimiento percibido. Como punto de datos sin sentido, MIN() tomó .36s mientras que SORT y LIMIT tomaron .84s contra una tabla de 106,000 filas en mi servidor de desarrollo.

Sin embargo, si está viendo una columna indexada, la diferencia es más difícil de notar (el punto de datos sin sentido es 0.00s en ambos casos). Sin embargo, al mirar el resultado de Explain, parece que MIN() es capaz de arrancar el valor más pequeño del índice ('Seleccionar tablas optimizadas de distancia' y 'NULL' filas) mientras que el SORT y LIMIT aún necesita hacer un recorrido ordenado del índice (106,000 filas). El impacto real en el rendimiento es probablemente 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 que usar SORT y LIMIT sería conveniente, como se mencionó en mson, donde está escribiendo una operación general que encuentra los valores N superiores o inferiores de columnas arbitrarias y no vale la pena escribir el caso especial operación.

+5

o (n) para una sola pasada frente a 0 (nlogn) para ordenar –

+1

@AbhishekIyer tiene toda la razón, pero yo añadiría "en el peor de los casos para el campo no indizado". – dmikam

7
SELECT MIN(`field`) 
FROM `tbl`; 

Simplemente porque es compatible con ANSI. El límite 1 es particular para MySql ya que TOP es para SQL Server.

+0

La mayoría de los DBMS tienen límite/offset o equivalente, y se utiliza en la mayoría de las aplicaciones que he trabajado (no como una alternativa a MIN, pero para otros fines, como la paginación.) – finnw

+0

@finnw - Estoy de acuerdo, pero el ejemplo del que pregunta fue comparar el límite con el mínimo explícitamente. –

2

Dado un rendimiento aceptable, usaría el primero porque semánticamente está más cerca de la intención.
Si el rendimiento fue un problema, (La mayoría de los optimizadores modernos optimizarán de forma previsible ambos en el mismo plan de consulta, aunque debe probar para verificarlo), entonces, por supuesto, usaría el más rápido.

3

Creo que las respuestas dependen de lo que esté haciendo.

Si tiene una consulta de 1 apagado y la intención es tan simple como ha especificado, seleccione min (campo) es preferible.

Sin embargo, es común tener este tipo de requisitos se ponga - top grab n resultados, enésimo Grab - Resultados MTH, etc.

no creo que es demasiado terrible una idea de comprometerse con su elegido base de datos. Cambiar dbs no debe tomarse a la ligera y hay que revisar el precio que paga cuando realiza este movimiento.

¿Por qué limitarse ahora, para el dolor que puede o no sentir más adelante?

yo creo que es bueno para mantenerse ANSI tanto como sea posible, pero eso es sólo una guía ...

4

Como mson y Sean McSomething han señalado, MIN es preferible.

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