在计算MySQL

时间:2015-07-30 07:11:50

标签: mysql sql performance select count

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

*在查询中引用了什么,它与其他两种方式有何不同?

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

更新

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

3 个答案:

答案 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)需要扫描表格。