count(*)、count(1)、count(id)、count(字段)的区别与性能分析
目录
一、查询规则
count(*):获取表的行数
count(1):所有行进行统计,包括NULL行
count(id):count(*)查询的是总条数,count(id)查询的是id非null的条数,带索引。
count(不带索引字段):获取某一字段值不为null的数据条数,就是说当某一条或者多条记录的那个字段为null的时候,这时并不会算进总条数中。
二、总结
300万条数据做的测试~
count(可空字段) ≈ count(不带索引) < count(主键 id-带索引的) < count(1) ≈ count(*)
查询行的>查询带索引的字段>不带索引的字段
1)count(*)与count(1):
都是扫描全表,但不取值,包括了所有的列,相当于行数,在统计结果的时候,不会忽略NULL。count(1)包括了忽略所有列,用1代表代码行。
执行结果几乎是是一样的。
2)count(1)与count(字段):
count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。所以count(1) 更快
3)count(id)与count(非空字段):
索引有三种:唯一索引、主键索引和聚集索引,主键索引是唯一索引的特定类型。
该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
三、百万条数据SQL测试
SELECT count(*) FROM `city` SELECT count(0) FROM `city` SELECT count(1) FROM `city` SELECT count(id) FROM `city` SELECT count(name) FROM `city` SELECT count(state) FROM `city`
sql 结果 耗时 count(*) 3012048 0.846s count(1) 3012048 0.850s count(id) 3012048 0.974s count(name) 3012000 1.032s count(state) 3012000 1.027s 有用请点赞,养成良好习惯!
疑问交流鼓励请留言!


