这里,首先你要弄清楚count()的语义。count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。
所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。
innoDB中
1 使用count(1)的时候,扫描全表,不取值,返回的每一行结果都是1,对结果判断不为Null就累加
2 使用count(非空字段),扫描全表,去除字段值,对结果累加
3 使用count(可空字段),扫描全表,取出字段值,因为字段可能为null,所以要先判断是否为null,不为null则累加
4 使用count(id),扫描全表,取出ID值,因为主键是不为null的,所以对结果累加
5 使用count(*),mysql会对此自动进行优化,扫描全表,不取值,对结果累加
因此得出结论,效率排序为count(1)≈count(*)>count(id)=count(非空字段)>count(可空字段),
mysam中
使用count(*)时,表的行数直接从磁盘中取出,因为在MySam中,表的行数是直接存储在磁盘上,所以可以快速拿出,所以效率非常高