计算所有行时要计算什么 MySQL

What to count when counting all rows MySQL

在计算 * 、任何自定义字段 ( n ) 或 MySQL 中的 primary id 时,性能或后台执行行为是否有任何差异?

* 在查询中具体指的是什么,它与其他两种方式有何不同?

SELECT COUNT( * ) FROM t;
SELECT COUNT( id ) FROM t;
SELECT COUNT( n ) FROM t;

更新:

假设,idn 在任何记录中都不为空。

count(*) 在某些情况下有一些优化(查询单个 MyISAM table 没有 where 子句),这可能是 OP 中的情况,具体取决于存储引擎。如果您的查询没有遇到这种特殊情况,MySQL 将必须构建一个执行计划并且 运行 正常查询,这与 count(my_primary_key) 一样好(或坏)如果你有一个主键。

长话短说 - 不要想太多。只需使用 count(*) 并让数据库担心优化您的查询。毕竟,这就是它的构建目的。

COUNT(*) will include NULLS
COUNT(column_or_expression) won't.

这意味着 COUNT(any_non_null_column) 将给出与 COUNT(*) 相同的结果,当然因为没有 NULL 值导致差异。

一般来说,COUNT(*)应该更好,因为可以使用任何索引,因为COUNT(column_or_expression)可能无法索引或SARGable

来自 ANSI-92(寻找 "Scalar expressions 125")

案例:

a) If COUNT(*) is specified, then the result is the cardinality of T.

b) Otherwise, let TX be the single-column table that is the result of applying the to each row of T and eliminating null values. If one or more null values are eliminated, then a completion condition is raised: warning- null value eliminated in set function.

同样的规则至少也适用于 SQL Server 和 Sybase

注意:COUNT(1)COUNT(*) 相同,因为 1 是不可为 null 的表达式。

对于 InnoDB tables,您可能会发现 "smallest" 索引用于 COUNT(*)COUNT(1)COUNT(id)。要查看此内容,请执行 EXPLAIN SELECT COUNT(...) FROM tbl;.

如果您没有二级索引,则必须扫描 'table'。

请注意,每个辅助键都包含 PRIMARY KEY 的列。所以,对于

PRIMARY KEY(a, b)
INDEX c_d (c, d)

可能这 4 列中任何一个的任何计数,或者 (1)(*) 将使用 c_d 索引。

COUNT(e) 需要扫描 table.