COUNT(列名)COUNT(1)COUNT(*)在MySQL中都是用来统计行数的聚合函数,但它们之间存在一些细微的差别:

  1. COUNT(列名):
  • 当你使用COUNT(列名)时,MySQL只会计算那些指定列中非NULL值的数量。这意味着,如果某行中该列的值为NULL,则不会被计入总数。
  • 这种用法适合于当你只关心某个特定列中有值的行数时,比如统计有效记录数(排除了该列值为NULL的情况)。
  1. COUNT(1):
  • COUNT(1)实际上并不关心列的值,它是一个常量表达式,每次计算都返回1。因此,它被用来统计表中的所有行,包括含有NULL值的行。
  • 由于它不涉及任何具体的列,因此在某些情况下(尤其是在InnoDB存储引擎下),它的执行效率可能与COUNT(*)相似,因为它不需检查列的具体内容。
  • 选择COUNT(1)通常是为了明确表示你只是在计数,而不是关心特定列的值。
  1. COUNT(*):
  • COUNT(*)是最常见的用法,它计算表中的所有行,无论行中的列值是否为NULL。
  • 在过去,人们有时认为COUNT(*)会比COUNT(1)慢,因为它理论上需要访问每一行的所有列。但在现代MySQL尤其是InnoDB存储引擎中,优化器足够智能,通常能优化COUNT(*)操作,使得其性能与COUNT(1)接近,尤其是在没有WHERE子句或使用覆盖索引的情况下。
  • 如果表上有索引并且查询条件能够利用到索引,那么在某些情况下COUNT(*)甚至可以更快,因为它可以直接从索引中获取行数,而无需访问实际的行数据。

总结来说,选择哪种形式主要取决于你的具体需求:

  • 如果你想统计表中的所有行,包括那些某些列值为NULL的行,COUNT(*)COUNT(1)都是好选择,两者在现代MySQL中性能差异不大。
  • 如果你只关心某一列非NULL值的数量,应该使用COUNT(列名)