MySQL中的COUNT(id)与COUNT(*)

时间:2009-11-08 16:56:10

标签: sql mysql count

以下查询之间是否存在差异,假设表中存在主要字段“id”(如速度等)?

SELECT COUNT(id) 
  FROM table

VS。

SELECT COUNT(*) 
  FROM table

4 个答案:

答案 0 :(得分:18)

在www.mysqlperformanceblog.com上查看Count(*) vs Count(col),他们讨论了各种'col'类型的这个主题(NOT NULL或不带索引等),以及MyISAM和InnoDB表。

答案 1 :(得分:2)

我知道问题是关于MySQL的,但是对于它的价值,建议Oracle使用count(*):这表明这是特定于数据库的(参见BalusC上面的评论)。由于许多数据库(MS-SQL,MySQL)具有包含各种类型元数据的信息模式表,因此如果一种语法只是查找易于获得的值,而另一种语法直接进入表中,则必然存在差异。 。在一天结束时:尝试不同的选项,看看EXPLAIN告诉你的是幕后工作。

答案 2 :(得分:1)

使用InnoDB的COUNT(*)慢于COUNT(ID),因为InnoDB不缓存行数。

另一方面,使用MyISAM,因为MyISAM维护行数,所以count(*)查询会更快,并且可以立即返回结果。

对于MyISAM来说,保持行数很容易,因为在任何时候都只执行一个事务,因为MyISAM进行表级锁定。事务提交后,MyISAM可以很容易地在下一个事务开始之前更新表的行数(考虑到事务完成的插入和删除操作)。

但是,对于使用行级锁定的InnoDB,存在多个并发执行的事务(并且尚未提交)。为了确保一致性,每个事务都必须在事务开始时看到该表(包括表中的行数)以及它自己的更改。因此,对于每个并发事务,表中的行数显然可能不同。因此,在任何给定时间都没有单一的“正确”的行总数(除非没有更新事务在运行)。对于多个并发事务,实际上不可能缓存表中的总行数。

答案 3 :(得分:0)

COUNT(*) 计数(易名) 可以显示diff输出,因为Ename不是一列 不是null约束,它肯定有一些空值 哪些不计算在内。

希望它有帮助..!