count(*) count(1)

count(*) count(f)
count(*)统计表的行数,即使某一行全为null也会统计进来.
count(f) 统计f列非空的行数量.
明确了定义后,我们就能两者其实面向不同的需求层面.

性能问题:
count(*)要的是表的行数,而不管null问题,获取行数有几个渠道,全表扫(慢),走索引(快),走索引的问题是,空值是不会建索引的
所以从可为空的索引是无法获取到正确行数信息的.这样count(*)只能去全表扫描.
另外即使索引是唯一索引但是没有设定not nul属性,则数据库无法从索引获取到表的所有行数信息,只能全表扫描
这种情况下,count(f),如果f是唯一索引,则可以通过索引得到行数(count(f)因为他统计f列非空的行数量),效能自然高过count(*)
但是count(*)和count(f)的需求是不同的,所以这种比较其实没有意义.
如果表存在唯一非空索引(比如主键),则count(*)和count(f)性能相同.(f是主键)
count(1)是count(f)的另外一种写法而已.

posted @ 2018-04-09 17:32  java林森  阅读(160)  评论(0编辑  收藏  举报