COUNT(*)、COUNT(1)与COUNT(字段)的区别

在与数据库进行交互中,我们有时候需要统计数据量,这时就会用到COUNT()函数。

SELECT COUNT(*) FROM table

一 、COUNT()函数一共有几种写法?

  1. COUNT(*) 也就是统计所有行,它是按照行来统计,行是没有NULL的,统计的是表中所有的行的数量。
  2. COUNT(1) 统计一个常量,实际上也是按照行来统计,常量也是没有NULL的,同上。
  3. COUNT(字段) 统计一个表中的某一个字段,这时字段就会存在NULL,统计的是表中这个字段不为空的数量。从统计的数量上来看 COUNT(1) = COUNT(*) 不一定定于 COUNT(字段)

这样来看,需要具体情况具体分析,要分清楚是需要统计行的数量,还是需要统计字段不为空的数量。

二、COUNT(字段)与COUNT(*)、COUNT(1)谁的效率高

COUNT(*) 是SQL92中的标准函数,Mysql数据库对COUNT(*)提供了很好的优化。官网上写的COUNT(1)与COUNT(*)是相同的优化,讲道理COUNT(1)与COUNT(*)可以等同。

也就是说从效率上来看
COUNT(*) 等于 COUNT(1) 大于 COUNT(字段)

为什么呢?

如果是MyISAM存储引擎的话,每张表都有单独存储行的数量,也就是说只有一次读取效率就会高很多。

如果是常用的InnoDB引擎的话,反正只是需要行的数量不需要具体的值内容,这样走索引就好了,Mysql的索引分为聚簇索引与非聚簇索引,聚簇索引也就是主键索引,主键索引的叶子节点存储的是整行的记录,这样来看非聚簇索引的消耗就比较少一点,非聚簇索引的叶子节点存储的是主键值。

三、COUNT(1)与COUNT(*)如何选择

选COUNT(*),COUNT(*)写在了阿里的代码规范里,还是SQL92的标准,更加合适一点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值