计数(*)对计数(1)对计数(PK):哪个更好?

计数(*)对计数(1)对计数(PK):哪个更好?

我经常发现这三个变体:

SELECT COUNT(*) FROM Foo;SELECT COUNT(1) FROM Foo;SELECT COUNT(PrimaryKey) FROM Foo;

据我所见,他们都在做同样的事情,我发现自己使用了我的代码库中的三个。然而,我不喜欢用不同的方式做同样的事情。我该坚持哪一个?他们中有谁比那两个人好吗?


回首忆惘然
浏览 387回答 3
3回答

陪伴而非守候

其中两个总是给出相同的答案:COUNT(*)计数行数COUNT(1)还计算行数。假设pk是主键,并且值中不允许使用空值。COUNT(pk)还计算行数。但是,如果pk不被限制为NOTNULL,则会产生一个不同的答案:COUNT(possibly_null)计算列中具有非空值的行数。possibly_null.COUNT(DISTINCT pk)还计算行数(因为主键不允许重复)。COUNT(DISTINCT possibly_null_or_dup)计算列中不同的非空值数。possibly_null_or_dup.COUNT(DISTINCT possibly_duplicated)计算列中不同(必然为非空)值的数目。possibly_duplicated当它有NOT NULL上面的条款。通常,我会写COUNT(*);它是最初推荐的SQL表示法。类似地,对于EXISTS条款,我通常写WHERE EXISTS(SELECT * FROM ...)因为这是最初的推荐符号。替代方案不应该有任何好处;优化器应该看穿更模糊的符号。

桃花长相依

在某些情况下,这将取决于所使用的数据库类型以及表的类型。例如,使用MySQL,count(*)在MyISAM表下速度较快,而在InnoDB下速度较慢。在InnoDB下,您应该使用count(1)或count(pk).
打开App,查看更多内容
随时随地看视频慕课网APP