相信很多小伙伴都想了解 count(1) 和 count(*) 的性能问题 ,今天给大家做一下测试。
声明:本文使用MySql数据库,数据库表里面有100万条数据。
先测试 count(*)
可以看出,count(*) 用时间差不多15s.
再测试 count(1)
看到这个数据,我知道很多小伙伴还是找不到心里的答案,上面的测试会不会存在一些客观原因,所以重启电脑后,重新测试一下 count(1)
这次用时34s,是不是很惊讶?
下面看看在稳定状态下的性能对比
第一次 count(*) 5.49s
count(1) 5.11s
别着急,俗话都是三局两胜,五局三胜。
第二次 count(*) 4.86s count(1) 5.64s
第三次 count(*) 4.92s count(1) 4.39s
第一个总结
从上面的比较可以看出,count(*) count(1) 在没条件的情况下两者没有什么区别。
下面使用有条件的 select 进行对比
对比了两次,可以看出count(*) 快于count(1), 下面来解释一下
count(1) 和count(*) 对比
如果你数据库没有主键,那么count(1) 比count(*) 快,
如果有主键作为条件count(),那么count(1) 比count(*) 快。
如果表里面只有一个字段,那么还是count(*)最快
count 解释
count(*) 返回表中所有存在行的总数,包括null
count(1) 返回的是去除null以外的所有行的总数,有默认值的也会被记录
感兴趣的同学,可以动手测试一下
三条经验
这个也是好久之前在网上看到的
- 任何情况下select count(*) from table 是最优选择
- 减少select count(*) from table where condition = ? 这样的查询
- 杜绝 select count(colunm) from table
我目前是在职Java开发,如果你现在正在了解Java技术,想要学好Java,渴望成为一名Java开发工程师,在入门学习Java的过程当中缺乏基础的入门视频教程,你可以关注并私信我:01。我这里有一套最新的Java基础JavaSE的精讲视频教程,这套视频教程是我在年初的时候,根据市场技术栈需求录制的,非常的系统完整。