MySQL中count(1)和count(*)哪个性能好?

        当我们对某一张表中的数据需要统计数量的时候,我们通常会用到count(1)、count(*)或者count(字段),而这三种哪个方式的count效率最高呢?先来说结论:

count(1) = count(*) > count(字段)

为什么会得到如上的结论,下面来做下简单的说明 :

1、count(字段) 的执行过程

        count() 是一个聚合函数,聚合函数有个特点,null值是不参与聚合函数计算的。而函数的参数不仅可以是字段名,也可以是其他任意表达式。当使用count(name) 的时候,name字段为一个表达式,底层会统计name 字段不为 NULL 的记录,也就是说会进行全表扫描,name不为null时,就会将变量count + 1。

2、count(1) 的执行过程

        当使用count(1) 时,函数的参数为固定的1,它永远都是不为null的,因此只要读取到一条记录便会将count变量+1。可以看到count(1)相对于count(字段)明显少了一个步骤,就是不需要去读取字段的值,所以通常来说count(1)的执行效率是要笔count(字段)要快的。

3、count(*)的执行过程

        当我们看到 * 的时候,习惯的会认为会读取所有字段的值,但实际并不是这样的。通过下图的执行记录可以看到,count(*)等价于count(0)。也就是说当你使用 count(*) 时,MySQL 会将*参数转化为参数 0 来处理。

 所以,count(1)和count(*) 的执行过程基本上是一样,在性能方面也没什么差异。

结论:

  • 在平常开发的过程尽量避免使用count(字段) --> 底层会对全表进行扫描,从而统计该字段不为null的数量
  • count(1)和count(*)的执行效率是一样的 --> count(*)的底层并不会读取所有字段,而是执行的count(0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值