count(*)

53 阅读1分钟

count(*) 是在数据库中常用的统计行数的方法。下面是对于 count(*) 实现方式的说明以及与其他 count 类型的对比:

  1. count(*) 实现方式:

    • count(*) 是一种特殊的统计方式,它并不关心字段是否为 NULL,只关心记录的数量。
    • InnoDB 引擎对于 count(*) 的处理是专门优化过的,它不需要取出实际的字段值,只需对记录的存在进行计数。
  2. count(主键 id) 与 count(1) 对比:

    • count(主键 id):需要遍历整张表,将每一行的主键 id 取出,对不为 NULL 的值进行累加。
    • count(1):也需要遍历整张表,但不取实际值,对每一行返回一个数字 1 进行累加。
    • 结论:count(1) 执行通常比 count(主键 id) 快,因为不需要涉及解析数据行和拷贝字段值的操作。
  3. count(字段) 对比:

    • count(字段):如果字段被定义为 not null,则一行行地读取字段值,对不为 NULL 的值进行累加;如果字段允许为 NULL,则还需要判断字段是否为 NULL,只有不为 NULL 才进行累加。
    • count(*):不关心具体的字段值,只关心记录的存在,因此在效率上通常优于 count(字段)
  4. 建议使用 count(*):

    • 从效率的角度来看,count(*) 通常是最优选择,因为它不涉及字段的实际值,只进行记录的存在性判断,适用于各种情况。

总体来说,count(*) 在效率上往往是最优的选择,尤其是在大数据表的统计操作中。