12人参与 • 2025-12-11 • Mysql
count()函数是使用率极高的工具,无论是统计表中记录总数,还是按条件聚合计数,都能轻松胜任。但你是否真正了解count()的底层逻辑?不同参数下的性能差异如何?本文我将从原理、用法、优化策略等维度深度解析,帮助开发者避免常见误区,写出高效的统计语句。
count(expr) -- 统计满足条件的expr非null值的数量 count(*) -- 统计符合条件的记录总数(包括全null行)
| 参数形式 | 含义说明 | 性能表现 |
|---|---|---|
| count(*) | 统计所有行(包括值为 null 的列),不忽略任何行 | 受索引影响较小 |
| count(字段) | 统计该字段非 null 值的数量,会忽略字段值为 null 的行 | 依赖字段是否有索引 |
| count(1) | 等价于 count (),统计所有行,1 为常量表达式,执行效率与 count () 基本一致 | 与 count (*) 相同 |
-- 表结构:users(id int, name varchar(50), age int) -- 统计总记录数(包含name为null的行) select count(*) from users; -- 统计age非null的记录数 select count(age) from users; -- 与count(*)等价,写法更直观 select count(1) from users;
-- 查看执行计划 explain select count(*) from users; -- 输出结果中key列显示使用的索引(如primary、idx_name)
| 需求场景 | 推荐写法 | 理由 |
|---|---|---|
| 统计总行数(含 null 行) | count(*) | 主键索引下效率最高 |
| 统计非 null 字段数量 | count(字段) | 若字段有索引且非 null 比例高,效率优于 count (*) |
| 兼容旧版或习惯写法 | count(1) | 逻辑清晰,执行效率与 count (*) 一致 |
-- 场景:统计status=1的订单数 create index idx_status on orders(status); select count(*) from orders where status=1; -- 使用idx_status索引
对于千万级以上数据量的表,建议采用以下方案:
create table visit_stats (
day date primary key,
uv hll
);
-- 统计日活(近似值)
select hll_count(uv) from visit_stats where day='2023-10-01';
count()函数看似简单,实则暗藏诸多性能细节:
掌握这些要点,能让你在数据统计场景中写出高效、稳定的 sql 语句。
到此这篇关于mysql中count函数的使用小结的文章就介绍到这了,更多相关mysql count函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论