以下查询之间是否存在差异,假设表中存在主要字段“id”(如速度等)?
SELECT COUNT(id)
FROM table
VS。
SELECT COUNT(*)
FROM table
答案 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约束,它肯定有一些空值 哪些不计算在内。
希望它有帮助..!