【MySQL笔记】梳理下COUNT(*),COUNT,COUNT(字段名)区别、查询过程及常见问题
warning:
这篇文章距离上次修改已过250天,其中的内容可能已经有所变动。
在MySQL中,COUNT(*)
、COUNT(1)
和COUNT(字段名)
都是用来计算行数的聚合函数,但它们有不同的应用场景和效果。
COUNT(*)
: 计算所有的行数,包括NULL值。COUNT(1)
: 与COUNT(*)
效果相同,但从优化器的角度来看,COUNT(1)
可能被视为常数计数,可能会有更好的性能。COUNT(字段名)
: 计算指定字段非NULL值的行数。
查询过程:
COUNT(*)
: 扫描整个表或部分索引,对于每一行,返回1,然后进行累加。COUNT(1)
: 与COUNT(*)
效果相同,但可能因优化器而异。COUNT(字段名)
: 扫描整个表或部分索引,对于每一行,如果字段名
不为NULL,返回1,然后进行累加。
常见问题:
- 对于有索引的字段,
COUNT(字段名)
可能比COUNT(*)
更快,因为它不需要检查整行。 - 如果表中大部分行的指定字段为NULL,使用
COUNT(字段名)
会比COUNT(*)
更慢,因为它需要检查每一行是否非NULL。 COUNT(1)
不受字段是否为NULL的影响,总是返回行数。
示例代码:
-- 创建示例表
CREATE TABLE example_table (
id INT,
value VARCHAR(10)
);
-- 插入数据
INSERT INTO example_table (id, value) VALUES (1, 'A'), (2, NULL), (3, 'B'), (4, NULL);
-- 查询
SELECT
COUNT(*) AS total_rows, -- 返回4
COUNT(1) AS count_1, -- 返回4
COUNT(id) AS count_id, -- 返回3,不计算NULL值
COUNT(value) AS count_value -- 返回2,不计算NULL值
FROM
example_table;
评论已关闭