当我们要对表中的数据进行统计时,就要使用到count()函数,那么count(主键)、count(字段)、count(1)和count(*)这些都能对表数据进行统计,但是他们有什么区别呢?
count(主键) | InnoDB 引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为nul) |
count(字段) | 没有not nul 约束: InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。 有not null 约束: InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。 |
count(1) | InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加 |
count(*) | InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加 |
所以从以上表格中我们可以看到,
count(主键):虽然主键是一个索引,遍历速度应该很快,但是在count(主键)中它会有一个累加的操作
count(字段):不仅要把每行的字段值取出来,还要判断是不是null,最后在进行一个累加操作,所以它是会忽略字段为null 的情况,即不统计字段为null 的记录
count(1):遍历整张表,但是如果有null值的话,它是不会忽略的,也就是会包含null的记录
count(*):专门做了优化,不会进行取值操作。相当于求记录总行数,在统计结果的时候,不会忽略NULL
所以按照效率排序的话,count(字段)< count(主键 id) < count(1) count(*),所以尽量使用 count(*)。