执行效率排序
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. 每条记录都会访问字段数据,开销较高。 | 最低 | 统计某字段非空记录数。 |
总结
-
COUNT(*) 是效率最高的统计方法:
- 该方法优化为常量,直接统计所有记录,不会读取字段数据,开销最小。
- 推荐在统计所有记录数时使用。
-
COUNT(1) 效率较高:
COUNT(1)
作为通用方法,不会读取字段,但由于进行了特定优化,性能略低于COUNT(*)
。
-
COUNT(主键字段) 效率较高:
- 由于主键字段不可能为 NULL,因此可以避免读取字段数据,优化效率。
-
COUNT(字段名) 开销最大:
- 由于字段为空时判断会耗费更多的 IO 操作,因此该方法的性能较差,适用于特定字段非空值的统计。