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(字段)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。