Solución:
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 su GROUP BY
no se está aprovechando de ningún miembro del grupo, solo de sus llaves. DISTINCT
hace esto explícito, por lo que puede salirse con la suya con un optimizador un poco más tonto.
En caso de duda, ¡pruébelo!
Si tiene un índice en profession
, estos dos son sinónimos.
Si no lo hace, utilice 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 DESC
pedido.
DISTINCT
crea una tabla temporal y la usa para almacenar duplicados. GROUP BY
hace lo mismo, pero luego recupera los distintos resultados.
Entonces
SELECT DISTINCT u.profession FROM users u
es más rápido, si no tiene un índice en profession
.
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 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, ¡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:
// 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.
Por lo tanto, debe tener cuidado de no tomar las respuestas anteriores como correctas para todos los casos … ¡Puede confundirse y obtener resultados incorrectos mientras todo lo que deseaba era optimizar!