count(*) 是在数据库中常用的统计行数的方法。下面是对于 count(*) 实现方式的说明以及与其他 count 类型的对比:
-
count(*) 实现方式:
count(*)是一种特殊的统计方式,它并不关心字段是否为 NULL,只关心记录的数量。- InnoDB 引擎对于
count(*)的处理是专门优化过的,它不需要取出实际的字段值,只需对记录的存在进行计数。
-
count(主键 id) 与 count(1) 对比:
count(主键 id):需要遍历整张表,将每一行的主键 id 取出,对不为 NULL 的值进行累加。count(1):也需要遍历整张表,但不取实际值,对每一行返回一个数字 1 进行累加。- 结论:
count(1)执行通常比count(主键 id)快,因为不需要涉及解析数据行和拷贝字段值的操作。
-
count(字段) 对比:
count(字段):如果字段被定义为 not null,则一行行地读取字段值,对不为 NULL 的值进行累加;如果字段允许为 NULL,则还需要判断字段是否为 NULL,只有不为 NULL 才进行累加。count(*):不关心具体的字段值,只关心记录的存在,因此在效率上通常优于count(字段)。
-
建议使用 count(*):
- 从效率的角度来看,
count(*)通常是最优选择,因为它不涉及字段的实际值,只进行记录的存在性判断,适用于各种情况。
- 从效率的角度来看,
总体来说,count(*) 在效率上往往是最优的选择,尤其是在大数据表的统计操作中。