count(*) count(1) count(字段) count(1) count(主键id) 比较
原则:
1.service层要什么给什么
2.InnoDB只给必要的值
3.现在的优化器只优化count(*)的语义为--取行数--,其他‘显而易见’的优化并没有做。
对于count(主键id),InnoDB引擎会遍历整张表,把每一行的id取出来,返回给service层。service判断是不可能为空,就按行累加
对于count(1)来说,InnoDB引擎遍历整张表,但不取值.service层对于每一行,放一个 --1-- 进去,判断是不可能为空,按行累加
对于count(字段)
1.如果这个字段定义为 not null,一行行的从记录里面读出这个字段,判断不能为null ,按行累加。
2.如果这个字段定义允许为null ,那么执行的时候,判断是否是null,还要把值取出来在判断,不是null 才累加。
但是count(*)是例外,并不会把所有字段全部取出来,而是做了专门优化,不取值。count(*)肯定不是null,按行累加。
所以结论是:按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(*),所以我建议 你,尽量使用count(*)。
用于记录,学习。