如果我有一张桌子

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更快

选择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是这样。

比较:

描述从northwind.products中选择不同的产品名称 描述从北风选择的产品名称。产品组按产品名称

第二个查询在Extra中额外给出了“Using filesort”。

它们本质上是等价的(事实上,这就是一些数据库在底层实现DISTINCT的方式)。

如果其中一个更快,它就是DISTINCT。这是因为,尽管两者是相同的,但查询优化器必须捕获这样一个事实,即GROUP BY没有利用任何组成员,只利用了它们的键。DISTINCT将此显式化,因此可以使用稍微笨一点的优化器。

有疑问的时候,测试一下!

经过大量的测试,我们得出的结论是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秒)

(更多的是功能性说明)

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

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

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

在MySQL中,“Group By”使用了一个额外的步骤:文件排序。我意识到DISTINCT比GROUP BY快,这是一个惊喜。