Si tengo una mesa
CREATE TABLE users (
id int(10) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
profession varchar(255) NOT NULL,
employer varchar(255) NOT NULL,
PRIMARY KEY (id)
)
y quiero obtener todos los valores únicos de professioncampo, lo que sería más rápido (o recomendado):
SELECT DISTINCT u.profession FROM users u
o
SELECT u.profession FROM users u GROUP BY u.profession
?

Respuestas:
Son esencialmente equivalentes entre sí (de hecho, así es como algunas bases de datos se implementan
DISTINCTbajo el capó).Si uno de ellos es más rápido, lo será
DISTINCT. Esto se debe a que, aunque los dos son iguales, un optimizador de consultas debería detectar el hecho de queGROUP BYno se está aprovechando de ningún miembro del grupo, solo de sus claves.DISTINCTlo hace explícito, para que pueda salirse con la suya con un optimizador ligeramente más tonto.En caso de duda, prueba!
fuente
DISTINCTyGROUP BYdifieren en esoDISTINCTno tiene que ordenar la salida, yGROUP BYpor defecto sí. Sin embargo, en MySQL, incluso unDISTINCT+ORDER BYpodría ser aún más rápido queGROUP BYdebido a las sugerencias adicionales para el optimizador como lo explica SquareCog.Si tiene un índice
profession, estos dos son sinónimos.Si no lo haces, entonces úsalo
DISTINCT.GROUP BYenMySQLespecie resultados. Incluso puedes hacer:y ordena tus profesiones en
DESCorden.DISTINCTcrea una tabla temporal y la usa para almacenar duplicados.GROUP BYhace lo mismo, pero sortes los resultados distintos después.Entonces
es más rápido si no tiene un índice activado
profession.fuente
ORDER BY NULLalGROUP BYpara evitar el orden.Todas las respuestas anteriores son correctas, para el caso de DISTINCT en una sola columna vs GROUP BY en una sola columna. Cada motor db tiene su propia implementación y optimizaciones, y si le importa la muy pequeña diferencia (en la mayoría de los casos), ¡entonces tiene que probar con un servidor específico Y una versión específica! Como las implementaciones pueden cambiar ...
PERO, si selecciona más de una columna en la consulta, ¡entonces DISTINCT es esencialmente diferente! Porque en este caso comparará TODAS las columnas de todas las filas, en lugar de solo una columna.
Entonces, si tienes algo como:
Es un error común pensar que la palabra clave DISTINCT distingue filas por la primera columna que especificó, pero DISTINCT es una palabra clave general de esta manera.
Por lo tanto, debe tener cuidado de no tomar las respuestas anteriores como correctas para todos los casos ... ¡Podría confundirse y obtener los resultados incorrectos mientras que todo lo que quería era optimizar!
fuente
Elija lo más simple y lo más breve posible: DISTINCT parece ser más lo que está buscando solo porque le dará EXACTAMENTE la respuesta que necesita y ¡solo eso!
fuente
Agrupar por es costoso que Distinct ya que Agrupar por hace una clasificación del resultado mientras que distinto lo evita. Pero si desea hacer que group by produce el mismo resultado que distinto, ordene por nulo .
es igual a
fuente
SELECT profession FROM users GROUP BY professionbien distinto puede ser más lento que el grupo en algunas ocasiones en postgres (no sé sobre otros dbs).
ejemplo probado:
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
así que ten cuidado ... :)
fuente
Parece que las consultas no son exactamente las mismas. Al menos para MySQL.
Comparar:
La segunda consulta proporciona adicionalmente "Uso de ordenar archivos" en Extra.
fuente
ORDER BY NULLa laGROUP BYversión y serán lo mismo.En MySQL , "
Group By" utiliza un paso adicional:filesort. Me doy cuenta de queDISTINCTes más rápido queGROUP BYeso, y eso fue una sorpresa.fuente
Después de muchas pruebas, llegamos a la conclusión de que GROUP BY es más rápido
SELECCIONE sql_no_cache opnamegroep_intern DESDE
telwerkenDONDEopnemergroep(7,8,9,10,11,12,13) grupo por opnamegroep_intern635 total 0,0944 segundos Weergave van registra 0-29 (635 total, consulta duurde 0,0484 segundos)
SELECCIONE sql_no_cache distinct (opnamegroep_intern) DESDE
telwerkenDONDEopnemergroepEN (7,8,9,10,11,12,13)635 total 0.2117 segundos (casi 100% más lento) Weergave van registra 0-29 (635 total, consulta duurde 0.3468 seg)
fuente
(más de una nota funcional)
Hay casos en los que tiene que usar GROUP BY, por ejemplo, si desea obtener el número de empleados por empleador:
En tal escenario
DISTINCT u.employerno funciona bien. Quizás haya un camino, pero simplemente no lo sé. (Si alguien sabe cómo hacer una consulta con DISTINCT, ¡agregue una nota!)fuente
Aquí hay un enfoque simple que imprimirá los 2 tiempos transcurridos diferentes para cada consulta.
O pruebe SET STATISTICS TIME (Transact-SQL)
Simplemente muestra el número de milisegundos necesarios para analizar, compilar y ejecutar cada instrucción de la siguiente manera:
fuente
Esto no es una regla
Para cada consulta ... intente por separado y luego agrupe por ... compare el tiempo para completar cada consulta y use el más rápido ...
En mi proyecto, a veces uso group by y otros distintos
fuente
Si no tiene que hacer ninguna función de grupo (suma, promedio, etc. en caso de que desee agregar datos numéricos a la tabla), use SELECT DISTINCT. Sospecho que es más rápido, pero no tengo nada que mostrar.
En cualquier caso, si le preocupa la velocidad, cree un índice en la columna.
fuente
SELECT DISTINCT siempre será el mismo, o más rápido, que GROUP BY. En algunos sistemas (es decir, Oracle), puede estar optimizado para ser el mismo que DISTINCT para la mayoría de las consultas. En otros (como SQL Server), puede ser considerablemente más rápido.
fuente
Si el problema lo permite, intente con EXISTS, ya que está optimizado para terminar tan pronto como se encuentre un resultado (y no almacene ninguna respuesta), por lo tanto, si solo está tratando de normalizar los datos para una cláusula WHERE como esta
Una respuesta más rápida sería:
Esto no siempre es posible, pero cuando esté disponible, verá una respuesta más rápida.
fuente