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

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

🔍 COUNT(*)

✅ 统计表中所有行数(包括 NULL 值)

  • COUNT(*) 会统计表中的 所有行不会忽略 NULL
  • 其底层实现会遍历整个表,但不会具体读取字段,而是由 存储引擎优化 来获取行数。
  • 在 InnoDB 中COUNT(*) 会利用 聚簇索引 进行优化,性能通常较高。

🔍 COUNT(1)

✅ 统计表中所有行数(包括 NULL 值)

  • COUNT(1) 会统计 所有行不会忽略 NULL,与 COUNT(*) 类似。
  • 它的计算方式是把 1 作为一个常量,然后遍历整张表并对行数进行累加。
  • 性能上一般与 COUNT(\*) 接近,但 COUNT(*) 在 MySQL 经过了更多优化,因此通常优先选择 COUNT(*)
  • 注意: COUNT(2) 的行为与 COUNT(1) 完全相同,它会统计 所有行的数量,包括 NULL

🔍 COUNT(字段名)

✅ 统计该字段 NULL 的行数

  • 区别于 COUNT(\*)COUNT(1)COUNT(字段名) 仅统计 该字段不为 NULL 的行。
  • 如果某个字段存在 NULL 值,这些 NULL 值的行不会被统计。
  • 性能取决于是否使用索引:
    • 如果 字段名非空字段(NOT NULL)COUNT(字段名)COUNT(*) 结果相同。
    • 如果 字段名 存在 NULL 值,统计结果会小于 COUNT(*)

📊 性能比较

方式统计范围NULL 处理适用场景性能
COUNT(*)所有行统计 NULL统计总行数(推荐)最快(InnoDB 经过优化)
COUNT(1)所有行统计 NULL统计总行数一般等同于 COUNT(*)
COUNT(字段名)NULL忽略 NULL统计特定字段的非空值可能较慢(取决于索引)

🎯 最佳实践

  1. 如果要统计表中的总行数,使用 COUNT(*),因为 MySQL 针对它做了优化,特别是在 InnoDB 里。
  2. COUNT(字段名) 适用于需要排除 NULL 值的情况,比如统计某个字段的实际填写数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值