count(1)、count(*)、count(列名)的区别

133 阅读1分钟

count(1)、count(*)

从执行计划来看,两者效果是一致的。

当表的数据量大一些时(>1 万),count(1)的性能不如count(*)。

当表数据小于1万时,count(1)的性能以微弱优势胜出count(*)。

MySQL将count(*)会自动优化为count(1),走聚集索引,由此可见两者基本无差距。

image-20211212110054101

image-20211212110114839

count(1)、count(*)、count(列名)在计数上的区别

Nation(民族)表数据:

image-20211212114001058

执行查询结果:

image-20211212113028961

可见:count(列名)不计字段为Null的数据,count(1)、count(*)无论是否有值,都会计入总数。

执行效率

  • 列名为主键,count(列名)会比count(1)快
  • 列名不为主键,count(1)会比count(列名)快
  • 如果表多个列并且没有主键,则 count(1 的执行效率优于 count(*)
  • 如果有主键,则 select count(主键)的执行效率是最优的
  • 如果表只有一个字段,则 select count(*)最优。

引用:

zhuanlan.zhihu.com/p/89299468