首先,我想比较计数(*)和计数(Id),哪个有更好的性能?
mysql版本
5.6.21-1~dotdeb.1-log表信息
PRIMARY KEY (`id`),
KEY `is_availability` (`is_availability`,`is_del`)
ENGINE=InnoDB AUTO_INCREMENT=48993819 DEFAULT CHARSET=utf8 count(*)优于count(id)
count(*)仍好于count(id)那么,如果我可以得出结论,count(*)的性能要比count(id)好,为什么会这样呢?
从High Performance MySQL,我得到
如果mysql知道某些col不能为空,那么它将在内部优化count(col)以计数(*)。
所以我怀疑花费更多的时间是用来做这个优化工作的。
发布于 2016-02-26 13:35:44
通常情况下,COUNT(*)的性能会稍微好一些。COUNT(id)需要检查id是否不是NULL才能工作。这意味着它需要读取值(以及检查NULLness的小开销)。
当id是集群主键时,我希望大多数数据库中的时间是相同的。但是,即使对于声明为MySQL的列,也许NULL优化器也不会回避NULL检查。
注意:在进行计时时,您必须非常小心地从冷缓存开始。在您的示例中,速度更快的查询似乎是第一次运行,因此缓存似乎并不是性能差异的可能解释。
发布于 2016-02-26 13:36:20
COUNT(*)将计数表的所有行
计数(列)将只计算表中的非空列.
您可以检查这个文章
问题是,count(*)查询可以使用覆盖索引,而count(col)不能。当然,您可以将索引扩展为be (i,val),并让查询再次包含索引,但只有在无法更改查询(即第三方应用程序)或列名因原因出现在查询中,并且确实需要计数非空值时,我才会使用此解决方案。
https://stackoverflow.com/questions/35653049
复制相似问题