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 profession
campo, 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
DISTINCT
bajo 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 BY
no se está aprovechando de ningún miembro del grupo, solo de sus claves.DISTINCT
lo hace explícito, para que pueda salirse con la suya con un optimizador ligeramente más tonto.En caso de duda, prueba!
fuente
DISTINCT
yGROUP BY
difieren en esoDISTINCT
no tiene que ordenar la salida, yGROUP BY
por defecto sí. Sin embargo, en MySQL, incluso unDISTINCT
+ORDER BY
podría ser aún más rápido queGROUP BY
debido 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 BY
enMySQL
especie resultados. Incluso puedes hacer:y ordena tus profesiones en
DESC
orden.DISTINCT
crea una tabla temporal y la usa para almacenar duplicados.GROUP BY
hace 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 NULL
alGROUP BY
para 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 profession
bien 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 NULL
a laGROUP BY
versión y serán lo mismo.En MySQL , "
Group By
" utiliza un paso adicional:filesort
. Me doy cuenta de queDISTINCT
es más rápido queGROUP BY
eso, 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
telwerken
DONDEopnemergroep
(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
telwerken
DONDEopnemergroep
EN (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.employer
no 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