other column mysql sql database group-by distinct

column - ¿Qué es más rápido, SELECT DISTINCT o GROUP BY en MySQL?



mysql sum distinct other column (15)

(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:

SELECT u.employer, COUNT(u.id) AS "total employees" FROM users u GROUP BY u.employer

En tal caso, DISTINCT u.employer no funciona bien. Tal vez haya una forma, pero simplemente no lo sé. (Si alguien sabe cómo realizar una consulta de este tipo con DISTINCT, por favor agregue una nota)

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 del campo de la profession , 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

?


Agrupar por es más caro que Distinct ya que Agrupar por hace una clasificación sobre el resultado mientras que distintas lo evita. Pero si desea hacer un grupo, obtenga el mismo resultado que distinto dar orden por nulo ...

SELECT DISTINCT u.profession FROM users u

es igual a

SELECT u.profession FROM users u GROUP BY u.profession order by null


Aquí hay un enfoque simple que imprimirá los 2 diferentes tiempos transcurridos para cada consulta.

DECLARE @t1 DATETIME; DECLARE @t2 DATETIME; SET @t1 = GETDATE(); SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT SET @t2 = GETDATE(); PRINT ''Elapsed time (ms): '' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar); SET @t1 = GETDATE(); SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY SET @t2 = GETDATE(); PRINT ''Elapsed time (ms): '' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);

O pruebe SET STATISTICS TIME (Transact-SQL)

SET STATISTICS TIME ON; SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY SET STATISTICS TIME OFF;

Simplemente muestra la cantidad de milisegundos necesarios para analizar, compilar y ejecutar cada instrucción como se muestra a continuación:

SQL Server Execution Times: CPU time = 0 ms, elapsed time = 2 ms.


Después de pruebas pesadas llegamos a la conclusión de que GROUP BY es más rápido

SELECCIONE sql_no_cache opnamegroep_intern DE telwerken DONDE opnemergroep IN (7,8,9,10,11,12,13) ​​grupo por opnamegroep_intern

635 totaal 0.0944 segundos Weergave van registros 0 - 29 (635 totaal, consulta duurde 0.0484 seg)

SELECCIONE sql_no_cache distinct (opnamegroep_intern) DE telwerken DONDE opnemergroep IN (7,8,9,10,11,12,13)

635 totaal 0.2117 segundos (casi un 100% más lento) Weergave van registra 0 - 29 (635 totaal, consulta de 0.3468 seg)


Elija lo más simple y lo más corto posible si puede. DISTINCT parece ser más lo que está buscando solo porque le dará EXACTAMENTE la respuesta que necesita y solo eso.


En MySQL , " Group By " usa un paso adicional: el filesort . Me doy cuenta de que DISTINCT es más rápido que GROUP BY , y eso fue una sorpresa.


Esto no es una regla

Para cada consulta ... intente separar por separado y luego agrupe por ... compare el tiempo para completar cada consulta y use el más rápido ...

En mi proyecto alguna vez uso group by y distintas personas.


Parece que las consultas no son exactamente las mismas. Al menos para MySQL.

Comparar:

  1. Describa los distintos nombres de productos seleccionados de northwind.products
  2. Describa el nombre de producto seleccionado del grupo northwind.products por nombre de producto

La segunda consulta proporciona adicionalmente "Utilizar el archivo" en Extra.


SELECT DISTINCT siempre será igual o más rápido que GROUP BY. En algunos sistemas (es decir, Oracle), puede optimizarse para que sea igual a DISTINCT para la mayoría de las consultas. En otros (como SQL Server), puede ser considerablemente más rápido.


Si no tiene que realizar ninguna función de grupo (suma, promedio, etc. en caso de que desee agregar datos numéricos a la tabla), utilice SELECCIONAR DISTINCIÓN. 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.


Si tienes un índice de profession , estos dos son sinónimos.

Si no lo haces, usa DISTINCT .

GROUP BY en MySQL ordena los resultados. Incluso puedes hacer:

SELECT u.profession FROM users u GROUP BY u.profession DESC

y ordene sus profesiones en orden DESC .

DISTINCT crea una tabla temporal y la utiliza para almacenar duplicados. GROUP BY hace lo mismo, pero ordena los distintos resultados después.

Asi que

SELECT DISTINCT u.profession FROM users u

Es más rápido, si no tienes un índice de profession .


Son esencialmente equivalentes entre sí (de hecho, así es como algunas bases de datos implementan DISTINCT bajo el capó).

Si uno de ellos es más rápido, será DISTINCT . Esto se debe a que, aunque los dos son iguales, un optimizador de consultas tendría que detectar el hecho de que GROUP BY no está aprovechando a ningún miembro del grupo, solo sus claves. DISTINCT hace explícito, por lo que puede salirse con un optimizador un poco más tonto.

En caso de duda, prueba!


Todas las respuestas anteriores son correctas, para el caso de DISTINCT en una sola columna frente a GROUP BY en una sola columna. Cada motor de base de datos tiene su propia implementación y optimizaciones, y si le importa la pequeña diferencia (en la mayoría de los casos), debe probar contra 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 una sola columna.

Así que si tienes algo como:

// This will NOT return unique by [id], but unique by (id,name) SELECT DISTINCT id, name FROM some_query_with_joins // This will select unique by [id]. SELECT id, name FROM some_query_with_joins GROUP BY id

Es un error común pensar que la palabra clave DISTINCT distingue las filas por la primera columna que especificó, pero DISTINCT es una palabra clave general de esta manera.

Entonces, gente, 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!


bien distinto puede ser más lento que agrupar en algunas ocasiones en postgres (no sé acerca de otros dbs).

Ejemplo probado:

postgres=# select count(*) from (select distinct i from g) a; count 10001 (1 row) Time: 1563,109 ms postgres=# select count(*) from (select i from g group by i) a; count 10001 (1 row) Time: 594,481 ms

http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I

así que ten cuidado ... :)


Si el problema lo permite, intente con EXISTS, ya que está optimizado para finalizar tan pronto como se encuentre un resultado (y no almacene ninguna respuesta), entonces, si solo está tratando de normalizar los datos para una cláusula WHERE como esta

SELECT FROM SOMETHING S WHERE S.ID IN ( SELECT DISTINCT DCR.SOMETHING_ID FROM DIFF_CARDINALITY_RELATIONSHIP DCR ) -- to keep same cardinality

Una respuesta más rápida sería:

SELECT FROM SOMETHING S WHERE EXISTS ( SELECT 1 FROM DIFF_CARDINALITY_RELATIONSHIP DCR WHERE DCR.SOMETHING_ID = S.ID )

Esto no siempre es posible, pero cuando esté disponible, verá una respuesta más rápida.