count(*)、count(1)、count(id)、count(字段)的区别与性能分析

目录

一、查询规则

二、总结

三、百万条数据SQL测试

一、查询规则

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测试

Navicat存储过程批量生成测试数据

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(*)30120480.846s
count(1)30120480.850s
count(id)30120480.974s
count(name)30120001.032s
count(state)30120001.027s

有用请点赞,养成良好习惯!

疑问交流鼓励请留言!