【问题标题】:count(*) vs count(column-name) - which is more correct? [duplicate]count(*) vs count(column-name) - 哪个更正确? [复制]
【发布时间】:2011-03-01 12:20:39
【问题描述】:

如果你像这两个例子一样使用count(*)count(column-name) 会有什么不同吗?

我倾向于总是写count(*),因为它似乎更适合我认为它是一个聚合函数的概念,如果这有意义的话。

但我不确定它在技术上是否最好,因为我经常看到没有* 编写的示例代码。

count(*):

select customerid, count(*), sum(price) 
from items_ordered
group by customerid
having count(*) > 1;

对比计数(列名):

SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;

【问题讨论】:

标签: sql count


【解决方案1】:

是的,性能可能存在差异。根据您的查询和相关表的索引,可以更快地从索引中获取计数,而不是去表中获取数据。因此,您可能应该指定字段名称,而不是使用 *。

【讨论】:

    【解决方案2】:

    通常是相同的,但在细节上 AFAIK "count(*)" 更好 b/c "count(columnname)" 强制 DB 执行更多代码来查找该列名称(但不是必须的)。

    【讨论】:

    • 这取决于数据库,Oracle/MSSQL/MySQL/DB2 做的不同。
    【解决方案3】:

    这适用于 MySQL。我不确定其他人。

    区别在于:

    • COUNT(*) 将计算记录数。
    • COUNT(column_name) 将计算 column_name 不为空的记录数。

    因此COUNT(*) 是您应该使用的。如果您使用的是 MyISAM 并且没有 WHERE 子句,那么优化器甚至不必查看表,因为行数已经被缓存。

    【讨论】:

    • 所以我知道 count(col) 比 count(*) 慢,因为 MySQL 必须检查行以查看是否为 NULL,但如果列被定义为 NOT NULL,那么它仍然重要吗?
    • count( col ) 其中 col 是主索引列怎么样?我认为索引有助于更快地完成任务?
    • @Stphane 在这种情况下它将使用索引。
    【解决方案4】:

    当它是一个标识符(并且保证不是NULL)时,它可能无关紧要。

    但是,COUNT(*)COUNT(column) 之间通常存在差异,COUNT(column) 将返回列中非NULL 值的计数。还有一个COUNT(DISTINCT column) 变体,它返回唯一的、非NULL 值的数量。

    【讨论】:

      【解决方案5】:

      您对COUNT(*)COUNT(column) 的使用应该基于所需的输出

      【讨论】:

      • 也存在性能差异(至少在 MySQL 中)(见我的回答)。
      • 准确来说,COUNT(column) 统计column 值不为NULL 的行,而COUNT(*) 统计表中的所有行。
      猜你喜欢
      • 2011-02-12
      • 2012-12-24
      • 2020-11-21
      • 2011-09-25
      • 2014-12-12
      • 2014-02-06
      • 2010-10-07
      相关资源
      最近更新 更多