MIN / MAX vs ORDEN POR y LÍMITE


De las siguientes consultas, ¿qué método consideraría el mejor? Cuáles son sus razones (eficiencia de código, mejor mantenibilidad, menos WTFery)...

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

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
 73
Author: nickf, 2009-01-09

5 answers

En el peor de los casos, cuando se trata de un campo no indexado, usar MIN() requiere una sola pasada completa de la tabla. Usar SORT y LIMIT requiere un fichero. Si se ejecuta contra una tabla grande, es probable que haya una diferencia significativa en el rendimiento percibido. Como un punto de datos sin sentido, MIN() tomó .36s mientras SORT y LIMIT tomó .84 contra 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). Mirando la salida de explain, sin embargo, parece que MIN() es capaz de simplemente extraer el valor más pequeño del índice ('Seleccionar tablas optimizadas lejos' y 'NULL' filas) mientras que el SORT y LIMIT todavía necesita hacer un recorrido ordenado del índice (106,000 filas). El impacto real en el desempeño 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 más claramente expresa el valor que está tratando de obtener. El único caso donde parece que usar SORT y LIMIT sería deseable sería, como se mencionó 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 la operación de caso especial.

 98
Author: Sean McSomething,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:40
SELECT MIN(`field`)
FROM `tbl`;

Simplemente porque es compatible con ANSI. El límite 1 es particular para MySQL como lo es para SQL Server.

 9
Author: Otávio Décio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-11 07:48:50

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
 6
Author: user650654,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:13

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

Si tiene una consulta 1 off y la intent es tan simple como especificó, es preferible seleccionar min(campo).

Sin embargo, es común que estos tipos de requisitos cambien a - grab top n results, grab nth - mth results, etc.

No creo que sea una idea demasiado terrible comprometerse con su base de datos elegida. Cambiar dbs no debe hacerse a la ligera y tiene que revisar es el precio que paga cuando se hace esto mover.

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

Creo que es bueno permanecer ANSI tanto como sea posible, pero eso es solo una guía...

 3
Author: mson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-09 01:43:54

Dado un rendimiento aceptable, usaría el primero porque semánticamente está más cerca de la intención.
Si el rendimiento fuera un problema, (la mayoría de los optimizadores modernos optimizarán probalbly ambos al mismo plan de la consulta, aunque usted tiene que probar para verificar eso) entonces por supuesto utilizaría el más rápido.

 2
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-09 01:29:18