1. COUNT(1)
- 功能:
统计表中行的数量,包含所有行,不论行中的值是什么。 - 工作原理:
每一行以常数 1 进行计算,即对于每一行都会计数一次,因此它的计算与 COUNT(*) 基本相同。 - 效率:
在某些数据库实现中,COUNT(1) 的性能可能与 COUNT(*) 相同,因为二者在功能上是等效的。
2. COUNT(*)
- 功能:
统计表中所有行的数量,包括所有列,无论列的值是否为 NULL。 - 工作原理:
按行统计时,不考虑列的具体值和数据类型。 - 效率:
是最常用的方法之一,特别是在 InnoDB 引擎中, COUNT(*) 通常是最优的计数形式,因为它被优化为直接统计数据页上的数目。
3. COUNT(column_name)
- 功能:
统计指定列中非 NULL 值的行数。 - 工作原理:
只计数该列中有非 NULL 值的行。因此,如果某行在 column_name 中的值为 NULL,则不会计入总数。 - 适用场景:
用于需要过滤掉 NULL 值时,例如,统计某个特定字段有值的记录数。
性能对比
- 现代数据库通常对 COUNT(*) 和 COUNT(1) 进行了优化,因此二者性能基本相似。
- COUNT(column_name) 可能较慢一些,特别是当列中有大量 NULL 值时,因为需要遍历和检查每一个值。
用法选择
- 大多数情况下:COUNT(*) 是首选,因为它清晰明了并且通常是经过优化的。
- 特定需求:当需要统计去除 NULL 值的特定列的值,只用 COUNT(column_name)。
小结
选择 COUNT()、COUNT(1) 或 COUNT(column_name) 应基于具体需求。如果只是需要统计总行数,可以使用 COUNT()。如果需要忽略某列中的 NULL 值,则需使用 COUNT(column_name)。它们之间选取的重要依据在于是否需要忽略 NULL 值及所用数据库的优化情况。