- count(1),表示扫描表,count(1)它在扫描到一行时不会取任何值,而是直接返回一个1,然后累加1的个数。
- count(),MyISAM引擎中直接在磁盘存了表的总行数,因此执行count()的时候直接返回总行数;InnoDB引擎中没有直接存表的总行数,因为执行count()的时候需要把数据一行一行地从引擎里读出来,然后累积计数,但是mysql对count()做了优化。官方文档说过,count(1)和count(*),MySQL的优化是完全一样的,根本不存在谁更快。
- count(id),取出每一行数据把id值返回给server层,因为id不可能为null,因此直接累加。
- count(字段),对于可以为null的字段取出后还需要判断,因此会慢。
对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。
对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。
单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作。
所以结论是:按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(),建议使用count()。