请不要再让count(*)背锅了,真的不比count(1)差

说count(*)慢的都应该看看自己在知识的路上是不是走得慢了

函数介绍

COUNT()是一个特殊的函数,有两种非常不同的作用:
它可以统计某个列值的数量,也可以统计行数

在统计列值时要求列值是非空的(不统计NULL)。如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数。

因为很多人对NULL理解有问题,所以这里很容易产生误解。如果想了解更多关于SQL语句中 NULL的含义,建议阅读一些关于SQL 语句基础的书籍。(关于这个话题,互联网上的一些信息是不够精确的。)

COUNT()的另一个作用是统计结果集的行数当MySQL确认括号内的表达式值不可能为空时,实际上就是在统计行数

最简单的就是当我们使用COUNT()的时候,这种情况下通配符并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数

我们发现一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数。果希望知道的是结果集的行数,最好使用COUNT(*),这样写意义清晰,性能也会很好。

MyISAM

一个容易产生的误解就是:MyISAM的COUNT()函数总是非常快,不过这是有前提条件的,即只有没有任何MHERE条件的COUNT(*)才非常快,因为此时无须实际地去计算表的行数。

MySQL 可以利用存储引擎的特性直接获得这个值(MyISAM引擎的总行数是记录在一个变量里面的)。如果MySQL 知道某列col不可能为NULL值,那么MySQL内部会将COUNT(col)表达式优化为COUNT(*)。

当统计带WHERE子句的结果集行数,可以是统计某个列值的数量时,MyISAM的COUNT()和其他存储引擎没有任何不同,就不再有神话般的速度了。
所以在MyISAM弓擎表上执行COUNT()有时候比别的引擎快,有时候比别的引擎慢,这受很多因素影响要视具体情况而定。

另一个误区

首先,count(*)和count(1)效率相差无几,二者执行计划完全一样,其次count(n)不代表统计第n列的非null值,n会被解释器视为常量,即不为空,会忽略所有列而统计行数

总结

  1. 如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数,即非空行
  2. 当MySQL确认括号内的表达式值不可能为空时(*或者N时),实际上就是在统计行数(因为都是非空行)
  3. COUNT(*)并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数
  4. count(1)和count() 执行计划优化策略是一样的,基本没有效率上的差距,count(N)不代表统计第N行,和count()一样会忽略所有列
    \
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值