count(*)、count(1)、count(id)、count(字段)有什么区别和性能差别

count(*)是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*) 肯定不是null ,按行累加。所以这里推荐使用count(*)

《阿里巴巴Java开发手册》有如下要求:

执行效果如下:

count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL

count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL

count(列名)只包括列名那一列,即某个列名值为NULL时,不统计。所以说不推荐,这里统计是数量可能会少一部分

效率如下:

字段为主键,count(字段)会比count(1)快
字段不为主键,count(1)会比count(字段)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*),(一般表都会有主键,所以可以忽略这个比较)
如果有主键,则 select count(主键)的执行效率是最优的,
如果表只有一个字段,则 select count(*)最优。

 

2万数据经过测试如下: count(*)、count(1)、count(id)、count(字段非主键) 、count(字段主键)差别不大

count(1)

 

count(字段非主键)

count(字段主键)

count(*)

270万数据经过测试如下: count(*)、count(1)、count(id)、count(字段非主键) 、count(字段主键) 差别任然不是很大

420万数据经过测试如下: count(*)、count(1)、count(id)、count(字段非主键) 、count(字段主键) 差别任然不到1秒

 

 

1000万数据经过测试如下: count(*)、count(1)、count(id)、count(字段非主键) 、count(字段主键) 稍微有点差别

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-01-29 09:56  My--style  阅读(362)  评论(0)    收藏  举报