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)
自己的公众号:我是坑货
上一篇: iOS开发之CocoaPods详解
下一篇: 高性能MYSQL—MySQL的组复制