146 votos

Lo que es más rápido, SELECT DISTINCT o GRUPO en MySQL?

Si tengo una tabla

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 de 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

?

137voto

SquareCog Puntos 12947

Son esencialmente equivalentes entre sí (de hecho esta es la forma en que algunas bases de datos implementar DISTINCT bajo el capó).

Si uno de ellos es más rápido, va a ser DISTINCT (especialmente en el caso de que usted tenga un index en la profesión). Esto es porque, aunque los dos son el mismo, un optimizador de consultas tendría que coger el hecho de que su GROUP BY no está tomando ventaja de cualquiera de los miembros del grupo, sólo sus claves. DISTINCT hace explícito, así que usted puede conseguir lejos con un poco tonto optimizador.

En caso de duda, la prueba!

59voto

Quassnoi Puntos 191041

Si usted tiene un índice en profession, estos dos son sinónimos.

Si no, a continuación, utilice DISTINCT.

GROUP BY en MySQL tipo de resultados. Incluso se puede hacer:

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

y conseguir sus profesiones ordenadas en DESC orden.

DISTINCT crea una tabla temporal y la utiliza para el almacenamiento de los duplicados. GROUP BY hace lo mismo, pero sortes los distintos resultados a posteriori.

Así que

SELECT DISTINCT u.profession FROM users u

es más rápido, si usted no tiene un índice en profession.

16voto

Tim Puntos 219

Ir para el más simple y más corta si se puede -- DISTINTO parece ser más de lo que usted está buscando sólo porque va a dar EXACTAMENTE la respuesta que necesita, y sólo eso!

8voto

daniel.gindi Puntos 1065

Todas las respuestas anteriores son correctas, para el caso de que DISTINTAS en una sola columna vs GRUPO en una sola columna. Cada motor de base de datos tiene su propia aplicación y optimizaciones, y si usted se preocupa por la muy poca diferencia (en la mayoría de los casos), a continuación, usted tiene que realizar la prueba específica de servidor Y la versión específica! Como las implementaciones pueden cambiar...

PERO, si selecciona más de una columna en la consulta, el DISTINTO es esencialmente diferente! Porque en este caso se comparan TODAS las columnas de todas las filas, en lugar de sólo una columna.

Así que si usted tiene algo así 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 las DISTINTAS palabras clave que distingue a las filas por la primera columna se especifica, pero el DISTINTO es una palabra clave general de esta manera.

Así que la gente tiene que ser cuidadoso de no tomar las respuestas anteriores correcta para todos los casos... Que se puede confundir y reciben malos resultados, mientras que todo lo que quería era optimizar!

6voto

OptilabWorker Puntos 51

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

prueba por ejemplo:

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 ... :)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X