首页 » 技术分享 » mysql:Count(*)与Count(1)、Count(2)、Count(‘anything’)及Count(字段)区别

mysql:Count(*)与Count(1)、Count(2)、Count(‘anything’)及Count(字段)区别

 

一:Count(*) 、Count(1)、Count(543)或者无论Count(‘anything’)

只要在Count中指定非NULL表达式,结果没有任何区别。因此当你指定Count(*) 或者Count(1)、Count(543)或者无论Count(‘anything’)时结果都会一样,因为这些值都不为NULL。

mysql5.7.23.0中实测:

数据表:

 

 

从结果上看,count(*)、count(1)、count(543)、count("dds")统计了所有记录,包括Sid为12,Sname为null,Sage为11的记录。

二:Count(字段)

对于Count(字段)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(字段)会计算该字段不为空的计数。

从结果上看,Sid为12,Sname为null,Sage为11的记录没有统计在count(Sname)中,其count(Sname)值为3,不是4。

三:关于Count(*)与count(1)等是否使用索引问题

经常会看到一些优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count(*)会带来全表扫描。而实际上如何写Count并没有区别

在mysql5.7.23.0中对Sname字段创建普通normal索引:

通过结果,可以看到count(*)、count(1)、count(222)均使用了key为index_Sname的索引。说明sql会对查询语句进行优化,如果有字段建立了索引,就会走索引。

在mysql5.7.23.0中,它会默认对主键添加索引,所以以下操作也会走索引:

 

通过结果,可以看到count(*)、count(1)均使用了key为PRIMARY的主键索引。

结论:若表中有索引,Count(*)与count(1)均会使用索引。由于mysql默认对主键添加索引,所以对存在主键的表进行count(*)、count(1)查询也都会使用主键索引。

转载自原文链接, 如需删除请联系管理员。

原文链接:mysql:Count(*)与Count(1)、Count(2)、Count(‘anything’)及Count(字段)区别,转载请注明来源!

2