MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?

949 阅读2分钟

执行效率排序

COUNT(*) > COUNT(1) > COUNT(主键字段) > COUNT(字段名)

区别对比

类型统计内容执行过程效率适用场景
COUNT(*)表中所有记录,包括 NULL 值1. 通用索引扫描,统计记录数。
2. 会被优化为常量 0,不读取任何字段数据。
3. 在 InnoDB 中,这种方式最简单,开销最低。
最高统计表中所有记录数。
COUNT(1)表中所有记录,包括 NULL 值1. 通用索引扫描,不读取具体字段,仅统计记录数。次高统计表中所有记录数(和 COUNT(*) 类似)。
COUNT(主键字段)主键字段非 NULL 的记录1. 主键字段不可能为 NULL,因此扫描主键索引。
2. 主键字段可避免 NULL,因而查询效率更高。
较高统计主键字段非空记录数。
COUNT(指定字段)指定字段非 NULL 的记录1. 通用索引扫描,读取指定字段,判断字段是否为 NULL。
2. 每条记录都会访问字段数据,开销较高。
最低统计某字段非空记录数。

总结

  1. COUNT(*) 是效率最高的统计方法

    • 该方法优化为常量,直接统计所有记录,不会读取字段数据,开销最小。
    • 推荐在统计所有记录数时使用。
  2. COUNT(1) 效率较高

    • COUNT(1) 作为通用方法,不会读取字段,但由于进行了特定优化,性能略低于 COUNT(*)
  3. COUNT(主键字段) 效率较高

    • 由于主键字段不可能为 NULL,因此可以避免读取字段数据,优化效率。
  4. COUNT(字段名) 开销最大

    • 由于字段为空时判断会耗费更多的 IO 操作,因此该方法的性能较差,适用于特定字段非空值的统计。