首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql计数(*)为什么比count(id)具有更好的性能

mysql计数(*)为什么比count(id)具有更好的性能
EN

Stack Overflow用户
提问于 2016-02-26 13:30:38
回答 2查看 2.8K关注 0票数 8

首先,我想比较计数(*)和计数(Id),哪个有更好的性能?

mysql版本

代码语言:javascript
复制
5.6.21-1~dotdeb.1-log

表信息

代码语言:javascript
复制
PRIMARY KEY (`id`),
KEY `is_availability` (`is_availability`,`is_del`)
ENGINE=InnoDB AUTO_INCREMENT=48993819 DEFAULT CHARSET=utf8 
  1. 无处比较 从op_log中选择计数(*);++

count(*)优于count(id)

  1. 与何地条件比较 从op_log is_availability=1选择计数(*);++ count(*)仍好于count(id)

那么,如果我可以得出结论,count(*)的性能要比count(id)好,为什么会这样呢?

High Performance MySQL,我得到

如果mysql知道某些col不能为空,那么它将在内部优化count(col)以计数(*)。

所以我怀疑花费更多的时间是用来做这个优化工作的。

EN

回答 2

Stack Overflow用户

发布于 2016-02-26 13:35:44

通常情况下,COUNT(*)的性能会稍微好一些。COUNT(id)需要检查id是否不是NULL才能工作。这意味着它需要读取值(以及检查NULLness的小开销)。

id是集群主键时,我希望大多数数据库中的时间是相同的。但是,即使对于声明为MySQL的列,也许NULL优化器也不会回避NULL检查。

注意:在进行计时时,您必须非常小心地从冷缓存开始。在您的示例中,速度更快的查询似乎是第一次运行,因此缓存似乎并不是性能差异的可能解释。

票数 10
EN

Stack Overflow用户

发布于 2016-02-26 13:36:20

COUNT(*)将计数表的所有行

计数(列)将只计算表中的非空列.

您可以检查这个文章

问题是,count(*)查询可以使用覆盖索引,而count(col)不能。当然,您可以将索引扩展为be (i,val),并让查询再次包含索引,但只有在无法更改查询(即第三方应用程序)或列名因原因出现在查询中,并且确实需要计数非空值时,我才会使用此解决方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35653049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档