如果我有一张桌子

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

我想获得所有专业领域的独特价值,什么会更快(或建议):

SELECT DISTINCT u.profession FROM users u

or

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

?


当前回答

(更多的是功能性说明)

有些情况下,你必须使用GROUP BY,例如,如果你想获得每个雇主的员工数量:

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

在这种情况下,DISTINCT u.c uemployer就行不通了。也许有办法,只是我不知道。(如果有人知道如何使用DISTINCT进行这样的查询,请添加注释!)

其他回答

如果问题允许,请尝试使用EXISTS,因为它被优化为只要找到结果就结束(并且不缓冲任何响应),因此,如果您只是试图为这样的WHERE子句规范化数据

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

更快的回答是:

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

这并不总是可行的,但当可用时,你会看到一个更快的响应。

(更多的是功能性说明)

有些情况下,你必须使用GROUP BY,例如,如果你想获得每个雇主的员工数量:

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

在这种情况下,DISTINCT u.c uemployer就行不通了。也许有办法,只是我不知道。(如果有人知道如何使用DISTINCT进行这样的查询,请添加注释!)

在postgres的某些情况下,distinct可能比group by慢(不知道其他dbs)。

测试的例子:

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

所以要小心……:)

经过大量的测试,我们得出的结论是GROUP BY更快

选择sql_no_cache opnamegroep_intern 从telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13) group by opnamegroep_intern

总共0.0944秒 显示记录0 - 29(共635条,查询持续0.0484秒)

选择sql_no_cache 不同的(opnamegroep_intern) 从telwerken WHERE opnemergroep IN (7,8,9,10,11,12,13)

635总共0.2117秒(几乎慢了100%) 韦格弗面包车记录0 - 29(总共635,查询时间0.3468秒)

在mySQL中,我发现GROUP BY将NULL视为不同的,而distinct不是。 采取完全相同的DISTINCT查询,删除了DISTINCT,并将所选字段添加为GROUP BY,并且由于其中一个字段为NULL,我得到了更多的行。

所以. .我倾向于相信mySQL中有更多的DISTINCT。