简单理解count()
count(1)与count(字段名)
count(1)中的1代表要查询的表中的第一个字段。比如要查询的表中有id、name两个字段,那么count(1)和count(id)得到的结果是一样的。
count(*)与count(字段名)
count(*)与count(字段名)基本上查询结果是一样的。
但是count(字段名)当字段名下有null值得时候,null值不计入count;而count(*)则返回表中所有的行的总数,包括值为null的行。
深度解析count()优化
COUNT()可能是被大家误解最多的函数了,它有两种不同的作用,其一是统计某个列值的数量,其二是统计行数。统计列值时,要求列值是非空的,它不会统计NULL。如果确认括号中的表达式不可能为空时,实际上就是在统计行数。最简单的就是当使用COUNT(*)时,并不是我们所想象的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。
我们最常见的误解也就在这儿,在括号内指定了一列却希望统计结果是行数,而且还常常误以为前者的性能会 更好。但实际并非这样,如果要统计行数,直接使用COUNT(*),意义清晰,且性能更好。
有时候某些业务场景并不需要完全精确的COUNT值,可以用近似值来代替,EXPLAIN出来的行数就是一个不错的近似值,而且执行EXPLAIN并不需要真正地去执行查询,所以成本非常低。通常来说,执行COUNT()都需要扫描大量的行才能获取到精确的数据,因此很难优化,MySQL层面还能做得也就只有覆盖索引了。如果还不能解决问题,那么只有从架构层面解决了,比如添加汇总表,或者使用redis这样的外部缓存系统。