count(*)和count(1)的区别和性能分析

查询记录数时会用到count,于是就有个问题。有的人用的是count(*) 有的用的是count(1),区别是什么,这两个的使用场景是什么?我这里主要针对的是MySQL,也许可能在别的引擎就不一定,比如别的搜索引擎会不会对count(*)有优化这个我就不确定。

首先你要你要知道这个count()是一个聚合函数,括号里面不仅仅可以填*和1还可以填别的比如说字段什么的。count(1)如果你给的条件是主键是有速度提升的,而count(*)即使不给主键作为条件的话,SQL也会自动优化。

有一个文章写得不错,可是不能转载,但有一部分关于count(字段),count(1)和count(*)的对比可以分享一下
在这里插入图片描述
最后那个结论可以关注一下,
大致的意思
count(字段),根绝字段判断为不为不空,根据字段定义,考虑要不要累加返回值,既然你引擎都返回值了,那我server层 “ +1 ”
count(id),根据id主键取值,累加返回值,也是server层 “ +1 ”
count(1),同样会遍历,但不取值,引擎告诉不为空那我就 “+1”
count(*),也不取值,而且人家还是经过优化的

根据上面的推倒,搜主键肯定比搜正常字段快, 不取值的一定比取值的快(我就是查数统计一下,你给我这一行所有的值也没啥用啊), 优化过的比没优化过的快

以下排行是按照效率,而不是时间
count(*) > count(1) > count(id) > count(字段)

反正我觉得count(*)不错,我再本地测试的时候分析性能的时候(数据量不大,且条件不是主键,基本二者差不多有的时候count(*) 可能会快一点。)

以下是我分析二者的SQL,可以再navicate可到分析有的版本甚至还能看到中间的步骤(然而我的这个版本没有)

EXPLAIN( SELECT COUNT(*) FROM goods_sample_img WHERE goods_id = 10048 AND valid=1)	
EXPLAIN( SELECT COUNT(1) FROM goods_sample_img WHERE goods_id = 10048 ANd valid=1)

自己的公众号:我是坑货

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值