count(*)和count(1)和count(列名)

count()是工作中经常使用的行数统计函数,最近想弄清楚count(*)和count(1)有什么区别,所以找了半天的资料,看到多种不同的说法,主要原因是数据库或存储引擎不同造成了其中的差异,下面总结一下:

使用方法:

        count(*) = count(1) = sum(1),返回的是结果集中所有行的数量,包括空行。

        count(列名),返回的是结果集中该列不为空的行数。count(列名)还能去重后再统计,count(distinct 列名)即相同的数据只统计一次。

执行效率:

        关于它们的执行效率的说法比较多,结合我自己的实践得出的比较认同的结论是:

        count(*) = count(1) >= count(列名)

        在mysql的官方文档中已明确写出,InnoDB存储引擎对count(*) 和count(1)的处理方式是一样,所以没有区别。

        oracle我没有找到官方的解释,只能通过它们的执行计划判断,count(*) 和count(1)的执行计划是一样的,我认为它们是一样的,网上很多人说它们的效率有细微的差异,但我觉得没必要纠结这一点点性能,毕竟很少会有不带where条件统计全表的情况。

        最后是 count(列名),由于 count(列名)需要多一个判断列是否为空的步骤,所以理所当然的比前两个要慢,但这时我突然想到,如果列上有非空约束是不是就不用多这一个步骤了,于是我赶紧去试一下,果不其然,在oracle数据库中:count有非空约束的列和count(*)一样,都使用了索引优化;但在mysql中count(列名),如果该列上没有索引就不会使用索引。

总结:count函数在不同的数据库中功能相同,效率方面有着细微的差异,其效率大概是 count(*) = count(1) >= count(列名),总体差别不大。

        

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值