【Mysql学习笔记】count(1)、count(*)、count(id)和count(字段)

reference1
reference2

  1. count(1),表示扫描表,count(1)它在扫描到一行时不会取任何值,而是直接返回一个1,然后累加1的个数。
  2. count(),MyISAM引擎中直接在磁盘存了表的总行数,因此执行count()的时候直接返回总行数;InnoDB引擎中没有直接存表的总行数,因为执行count()的时候需要把数据一行一行地从引擎里读出来,然后累积计数,但是mysql对count()做了优化。官方文档说过,count(1)和count(*),MySQL的优化是完全一样的,根本不存在谁更快。
  3. count(id),取出每一行数据把id值返回给server层,因为id不可能为null,因此直接累加。
  4. count(字段),对于可以为null的字段取出后还需要判断,因此会慢。

对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。

对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作。

所以结论是:按照效率排序的话,count(字段)),建议使用count()。

你可能感兴趣的:(linux,C++,mysql,学习,数据库)