计算所有行时要计算什么 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;
更新:
假设,id
和 n
在任何记录中都不为空。
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.
在计算 *
、任何自定义字段 ( n
) 或 MySQL 中的 primary id
时,性能或后台执行行为是否有任何差异?
*
在查询中具体指的是什么,它与其他两种方式有何不同?
SELECT COUNT( * ) FROM t;
SELECT COUNT( id ) FROM t;
SELECT COUNT( n ) FROM t;
更新:
假设,id
和 n
在任何记录中都不为空。
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.