【MySQL笔记】梳理下COUNT(*),COUNT,COUNT(字段名)区别、查询过程及常见问题
warning:
这篇文章距离上次修改已过439天,其中的内容可能已经有所变动。
在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;
评论已关闭