count(*) count(1) count(字段) count(主键) 谁更快

以下讨论都是基于InnoDB引擎
count是一个聚合函数,InnoDB只负责根据需求返回结果集,具体的计算过程再Server层完成

  • count(主键): InnoDB会遍历整张表,把每一行的id取出来,返回给Server层,server判断id是否为空,不为空则累加

  • count(1): InnDB遍历整张表,但是不取值,Server层对于返回的每一行都会放一个数字1进行,然后判断是否为空,不为空则累加

  • count(字段):

    1. 如果字段定义为not null, InnoDB会从表中读取出这个字段,Server层判断值不可能为空,直接累加
    2. 如果字段定义为null, InnoDB从表中读取整个字段是会将值也读取出来,Server层判断值是否为空,不为空则累加
  • count(*): Mysql对count(*) 专门做了优化,InnoDB再扫描的时候不取值,返回给Server层,Serve层直接按行累加

所以按效率排序是: count(*) ≈ count(1) > count(主键) count(字段)

你可能感兴趣的:(count(*) count(1) count(字段) count(主键) 谁更快)