在MySQL中使用COUNT(*)与单个值

在MySQL中使用COUNT(*)与单个值,mysql,Mysql,我似乎记得很久以前有人告诉我,在MySQL语句中使用COUNT(*)检查行是否存在是最有效的方法(而不是COUNT(某些列名称)),但我不确定。这是真的吗?我们应该使用COUNT(*)还是COUNT(某些列的名称)?COUNT(*)对结果集中的所有行进行计数(如果使用group BY,则为group)。 COUNT(column\u name)仅对column\u name不为NULL的行进行计数。在某些情况下,即使没有空值,这也可能较慢,因为必须检查该值(除非该列不可为空)。 COUNT(1)

我似乎记得很久以前有人告诉我,在MySQL语句中使用
COUNT(*)
检查行是否存在是最有效的方法(而不是
COUNT(某些列名称)
),但我不确定。这是真的吗?我们应该使用
COUNT(*)
还是
COUNT(某些列的名称)

COUNT(*)
对结果集中的所有行进行计数(如果使用group BY,则为group)。
COUNT(column\u name)
仅对column\u name不为NULL的行进行计数。在某些情况下,即使没有空值,这也可能较慢,因为必须检查该值(除非该列不可为空)。
COUNT(1)
COUNT(*)
相同,因为1永远不能为空

要查看结果的差异,您可以尝试以下小实验:

CREATE TABLE table1 (x INT NULL);
INSERT INTO table1 (x) VALUES (1), (2), (NULL);
SELECT
    COUNT(*) AS a,
    COUNT(x) AS b,
    COUNT(1) AS c FROM table1;
结果:

a   b   c 3   2   3
count(某些列)
统计该列中非空值的数量。本质上,您是在强制数据库读取该列的所有值(无论是通过表访问还是通过某些索引完成)


count(*)
统计表中的行数,从而使数据库可以更自由地选择使用哪些索引。理论上,这可能更快。

请参阅“谢谢”。我猜MySQL也是一样?…请看手册,上面有说明:好的。。。我猜这就解决了,尽管InnoDB方面还不清楚。谢谢,horse先生。查询中的谓词(例如WHERE子句中的条件)和适当索引的可用性将对搜索现有行的效率产生更大的影响。(就返回的结果而言,当
some\u column\u name
可为空时,您显示的两个选项之间存在很大的差异。)就效率而言,这取决于查询使用的索引中是否有
some\u column\u name
,从而避免了对底层数据页的查找。)