欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 22:53:40
...

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

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

有一个文章写得不错,可是不能转载,但有一部分关于count(字段),count(1)和count(*)的对比可以分享一下
count(*)和count(1)的区别和性能分析
最后那个结论可以关注一下,
大致的意思
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)

自己的公众号:我是坑货count(*)和count(1)的区别和性能分析