素材牛VIP会员
在mysql中计算记录总数时是使用COUNT(id) 还是 COUNT(*) ?
 39***81  分类:SQL代码  人气:1161  回帖:4  发布于6年前 收藏

根据我的理解,应该是使用COUNT(id)更加快速,因为如果我的id是一个自增的主键,那么计算它的数量显然比计算所有字段的数量需要消耗的资源少一些。但是我不止在一篇的类似指导mysql查询加速的文章中看到,都建议我们使用SELECT COUNT(*)而非直接COUNT主键,这是为什么呢?

 标签:sqlmysql

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv5 码农
Y2***Y2 JS工程师 6年前#1

原文地址:http://leihuang.org/2015/09/19/mysql-count/

count函数的作用

想要真正的理解count函数,我们就必须明白count函数的作用。

作用一:统计某一列非空(not null)值得数量,即统计某列有值得结果数,使用count(col)。

作用二:统计结果集的行数,此时不用管某列是否为null值。即使用count(*).

明白了这点,我们就应该知道MySQL的count(*)并不是想象中的那样,统计每一列的值,而是直接忽视掉所有列,直接统计行数,那么它的效率肯定是很高的。

但是有一点,当col指定了该字段为NOT NULL时实际上,MySQL会自动将count(col)转为count(*),但是这样也同样耗费了些时间,如果col没有指定为NOT NULL
的话,那么效率就更低了,MySQL就必须要判断每一行的值是否为空。

所以综上所述,最好优先使用select count(*)

当统计某一列等于多少的值得时候可以使用下面两种方法。

#统计出表中id为23的值的数量的两种方法
SELECT SUM(IF(id = 23,1,0)) FROM table 
SELECT COUNT(id = 23 OR NULL) FROM table 
Lv4 码徒
铁***1 JS工程师 6年前#2

貌似是因为用MyISAM引擎的表存储了总条数,如果没有WHERE或者WHERE恒为真(比如WHERE 1),那么COUNT(*)可以直接返回总条数。

另外,很显然COUNT(*)不是"计算所有的字段",显然MySQL会把*解析成“一条数据”的意思。

Lv3 码奴
随***火 站长 6年前#3

count(*)时会先去找主键,所以应该是count(id)更快些。不过,这点消耗很小,可以忽略不计,而且用这点消耗可以换来更安全的代码,用count(*)更好些。

Lv6 码匠
15***57 UI设计师 6年前#4

也许count()会快点,它是取所有的行数,count(ID)是取除ID为NULL的所有的行...写成count(主键)更多是为了标准化,在性能上和count()没有什么差别 所以...

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取