在计算*
,任何自定义字段(n
)或MySQL中的primary id
时,性能或后台执行行为是否有任何差异?
*
在查询中引用了什么,它与其他两种方式有何不同?
SELECT COUNT( * ) FROM t;
SELECT COUNT( id ) FROM t;
SELECT COUNT( n ) FROM t;
更新
假设id
和n
在任何记录中都不为空。
答案 0 :(得分:3)
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(寻找"标量表达式125")
案例:
a)如果指定
COUNT(*)
,则结果为 T 的基数。b)否则,让 TX 成为应用结果的单列表 到 T 的每一行并消除空值。 如果消除了一个或多个空值,则完成条件为 raise:在设置函数中消除了warning- null值。
至少
也适用于SQL Server和Sybase 注意:COUNT(1)
与COUNT(*)
相同,因为1是不可为空的表达式。
答案 1 :(得分:1)
count(*)
在某些情况下有一些优化(查询单个MyISAM表没有where
子句),这可能是OP中的情况,具体取决于存储引擎。如果你的查询没有遇到这种特殊情况,那么MySQL必须构建一个执行计划并正常运行查询,如果你有一个主键,那就和count(my_primary_key)
一样好(或坏)。
长话短说 - 不要过度思考。只需使用count(*)
,让数据库担心优化您的查询。毕竟,这就是它构建的目标。
答案 2 :(得分:1)
对于InnoDB表,您可能会发现"最小的" index用于COUNT(*)
,COUNT(1)
或COUNT(id)
。要查看此内容,请执行EXPLAIN SELECT COUNT(...) FROM tbl;
。
如果您没有二级索引,那么'表'必须扫描。
请注意,每个辅助密钥都包含PRIMARY KEY
的列。所以,对于
PRIMARY KEY(a, b)
INDEX c_d (c, d)
可能对这4列中的任何一列都有任何意义,或(1)
或(*)
将使用c_d
索引。
COUNT(e)
需要扫描表格。