MySQL中count的使用笔记

本文详细解析了SQL中count()函数的四种不同写法及其执行效率对比,包括count(*), count(1), count(列名)和count(distinct列名),并提供了在不同场景下选择最高效计数方式的指导原则。

count()四种写法:

  • count(*) 包括所有列,相当于统计表的行数,不忽略列值为NULL的记录。
  • count(1) 忽略所有列,1表示一个固定值,也可以用count(2)、count(3)代替,不忽略列值为NULL的记录。
  • count(列名)只包括指定列,返回指定列的记录数,会忽略列值为NULL的记录。
  • count(distinct 列名)只包括列名指定列,返回指定列的不同值的记录数,忽略列值为NULL的记录

执行效率比较

  1. 若列为主键,count(列名)效率优于count(1)
  2. 若列不为主键,count(1)效率优于count(列名)
  3. 若表中存在主键,count(主键列名)效率最优
  4. 若表中只有一列,则count(*)效率最优
  5. 若表有多列,且不存在主键,则count(1)效率优于count(*)

备:下面的第二条取自网络,自己对此不太理解,望广大网友多多指教

1.如果在开发中确实需要用到count()聚合,那么优先考虑count(),因为mysql数据库本身对于count()做了特别的优化处理。有主键或联合主键的情况下,count()略比count(1)快一些。 没有主键的情况下count(1)比count()快一些。
如果表只有一个字段,则count(*)是最快的。
2.使用count()聚合函数后,最好不要跟where age = 1;这样的条件,会导致不走索引,降低查询效率。除非该字段已经建立了索引。使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。
3.count(字段),非主键字段,这样的使用方式最好不要出现。因为它不会走索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值