在 MySQL 中,COUNT(*)
、COUNT(1)
和 COUNT(0)
在大多数情况下具有相似的性能表现。这是因为 MySQL 的查询优化器通常能够识别这些不同的计数方式并将其优化为相同的执行计划。具体来说:
-
COUNT(*)
: 计算表中的总行数。 -
COUNT(1)
: 计算表中非空值的数量,但由于1
是一个常量且总是非空,实际上它等同于计算总行数。 -
COUNT(0)
: 同样地,性能比较
-
执行计划:
- 当你使用
EXPLAIN
关键字查看查询的执行计划时,你会发现COUNT(*)
、COUNT(1)
和COUNT(0)
通常会产生相同的执行计划。
- 当你使用
-
实际性能:
- 在大多数现代版本的 MySQL 中,这三种计数方式在性能上几乎没有差异。MySQL 的查询优化器会将它们视为相同的操作
-
0
是一个常量且总是非空,因此这也等同于计算总行数。-- 创建用户表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL ); -- 插入用户数据 INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'password123'), ('jane_smith', 'jane@example.com', 'password456'); -- 使用 COUNT(*) SELECT COUNT(*) AS count_star FROM users; -- 使用 COUNT(1) SELECT COUNT(1) AS count_one FROM users; -- 使用 COUNT(0) SELECT COUNT(0) AS count_zero FROM users; -- 查看 EXPLAIN 计划 EXPLAIN SELECT COUNT(*) FROM users; EXPLAIN SELECT COUNT(1) FROM users; EXPLAIN SELECT COUNT(0) FROM users;
第一次 -- 使用 COUNT(*) SELECT COUNT(*) AS count_star FROM users > OK > 查询时间: 0.021s -- 使用 COUNT(1) SELECT COUNT(1) AS count_one FROM users > OK > 查询时间: 0.001s -- 使用 COUNT(0) SELECT COUNT(0) AS count_zero FROM users > OK > 查询时间: 0s -- 查看 EXPLAIN 计划 EXPLAIN SELECT COUNT(*) FROM users > OK > 查询时间: 0.003s EXPLAIN SELECT COUNT(1) FROM users > OK > 查询时间: 0s EXPLAIN SELECT COUNT(0) FROM users > OK > 查询时间: 0s
-
第二次 -- 使用 COUNT(*) SELECT COUNT(*) AS count_star FROM users > OK > 查询时间: 0.002s -- 使用 COUNT(1) SELECT COUNT(1) AS count_one FROM users > OK > 查询时间: 0s -- 使用 COUNT(0) SELECT COUNT(0) AS count_zero FROM users > OK > 查询时间: 0s -- 查看 EXPLAIN 计划 EXPLAIN SELECT COUNT(1) FROM users > OK > 查询时间: 0s EXPLAIN SELECT COUNT(0) FROM users > OK > 查询时间: 0s EXPLAIN SELECT COUNT(*) FROM users > OK > 查询时间: 0s
性能几乎基本一样