mysql的count(*),count(1),count(字段),count(主键ID)效率分析

这里,首先你要弄清楚count()的语义。count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。

所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。

innoDB中

1 使用count(1)的时候,扫描全表,不取值,返回的每一行结果都是1,对结果判断不为Null就累加
2 使用count(非空字段),扫描全表,去除字段值,对结果累加
3 使用count(可空字段),扫描全表,取出字段值,因为字段可能为null,所以要先判断是否为null,不为null则累加
4 使用count(id),扫描全表,取出ID值,因为主键是不为null的,所以对结果累加
5 使用count(*),mysql会对此自动进行优化,扫描全表,不取值,对结果累加
因此得出结论,效率排序为count(1)≈count(*)>count(id)=count(非空字段)>count(可空字段),

mysam中

使用count(*)时,表的行数直接从磁盘中取出,因为在MySam中,表的行数是直接存储在磁盘上,所以可以快速拿出,所以效率非常高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值