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

Mysql 计算所有行时要计算什么,mysql,sql,performance,select,count,Mysql,Sql,Performance,Select,Count,在计算MySQL中的*、任何自定义字段(n)或主id时,性能或后台执行行为是否有任何差异 在查询中,*具体指的是什么?它与这两种其他方式有何区别 SELECT COUNT( * ) FROM t; SELECT COUNT( id ) FROM t; SELECT COUNT( n ) FROM t; 更新: 假设id和n在任何记录上都不为空。在某些情况下(查询没有where子句的单个MyISAM表)有一些优化,这可能是OP中的情况,具体取决于存储引擎。如果您的查询没有遇到这种特殊情况,My

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

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

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

更新:

假设
id
n
在任何记录上都不为空。

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

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

COUNT(*) will include NULLS
COUNT(column_or_expression) won't.
这意味着
COUNT(任何非空列)
将给出与
COUNT(*)
相同的结果,因为没有导致差异的空值

通常,
COUNT(*)
应该更好,因为可以使用任何索引,因为
COUNT(列或表达式)
可能没有索引或可搜索

From(查找“标量表达式125”)

案例:

a) 如果指定了
COUNT(*)
,则结果为T的基数

b) 否则,让TX作为应用 到T的每一行,并消除空值。 如果消除了一个或多个空值,则表示完成条件 引发:警告-set函数中已消除空值

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


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

对于InnoDB表,您可能会发现“最小”索引用于
COUNT(*)
COUNT(1)
COUNT(id)
。要了解这一点,请解释从tbl中选择计数(…)

如果没有辅助索引,则必须扫描“表”

请注意,每个辅助键都包括
主键的列。那么,为了

PRIMARY KEY(a, b)
INDEX c_d (c, d)
这4列中的任何一列,或
(1)
(*)
上的任何计数都可能使用
c\u d
索引


COUNT(e)
将需要扫描该表。

COUNT(*)计数所有,COUNT(id)将只计数非null您无法真正比较返回不同结果的查询的性能:-?假设主id在任何记录上都不为null。我想,这很平常。对。问题实际上与性能无关,因为提供的选项提出了两个不同的问题。如果一个表有一个PK,那么几乎可以肯定count(*)将通过计算索引中的行来实现。要计算所有行,还可以使用
count(1)
count(*)和count(主键)不是吗same@Mihai-为什么它们不同?@RickJames一个计算空值,另一个不计算空值。@Mihai主键没有空值-也不计算空值。