mysql中count(1)、count(*) 与 count(列名) 的区别?
在 MySQL 中,COUNT()
函数的不同参数会导致统计行为的显著差异。以下是 COUNT(1)
、COUNT(*)
和 COUNT(列名)
的核心区别:
1. COUNT(*)
统计内容:所有行数(包括所有列都是
NULL
的行)。行为特点:
直接统计表中的物理行数,不考虑列值是否为空。性能说明:
在 MySQL 优化器中会被自动优化,优先使用索引(特别是二级索引)实现高效统计。示例:
SELECT COUNT(*) FROM employees;
注意:返回员工表的总行数。
2. COUNT(1)
统计内容:所有行数(与
COUNT(*)
结果相同)。行为特点:
1
是常量表达式,对每一行都返回1
,然后统计非NULL
值的数量。由于1
永远非NULL
,结果等价于COUNT(*)
。性能说明:
与COUNT(*)
性能完全相同(MySQL 优化器会以相同方式处理)。示例:
SELECT COUNT(1) FROM employees;
返回结果与 COUNT(*)
一致。
3. COUNT(列名)
统计内容:指定列中非 NULL 值的数量。
行为特点:
仅统计该列值不为NULL
的行。如果该列有NULL
值,则跳过计数。性能说明:
如果该列有索引,会优先扫描索引(索引不存储NULL
值,速度更快);无索引则需全表扫描。示例:
SELECT COUNT(email) FROM employees;
返回 email
列非空的员工数量。
性能深度解析
COUNT(*)
的优化:InnoDB 引擎优先扫描最小的二级索引(如有)。
无索引时扫描主键索引(聚簇索引)。
比
COUNT(列名)
更快(无需检查列值是否为NULL
)。COUNT(列名)
的优化:如果该列有索引(如
INDEX(email)
),直接扫描索引(速度快)。无索引时需全表扫描,检查每行的该列值(速度慢)。
大表优化方案:
使用近似统计:
SHOW TABLE STATUS LIKE 'table_name'
查看Rows
(估算值)。额外维护计数表(事务更新)。