it编程 > 数据库 > Mysql

MySQL中COUNT函数的使用小结

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; 

二、count (*) 的执行原理与索引影响

-- 查看执行计划
explain select count(*) from users;
-- 输出结果中key列显示使用的索引(如primary、idx_name)

三、count (字段) 的执行逻辑与常见误区

1.字段为 null 的处理

2.索引对 count (字段) 的影响

四、性能优化策略与最佳实践

1.根据场景选择参数

需求场景推荐写法理由
统计总行数(含 null 行)count(*)主键索引下效率最高
统计非 null 字段数量count(字段)若字段有索引且非 null 比例高,效率优于 count (*)
兼容旧版或习惯写法count(1)逻辑清晰,执行效率与 count (*) 一致

2.利用索引加速

-- 场景:统计status=1的订单数
create index idx_status on orders(status);
select count(*) from orders where status=1; -- 使用idx_status索引

3.避免全表扫描

4.大表统计的终极方案

对于千万级以上数据量的表,建议采用以下方案:

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函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MySQL误删数据恢复的操作指南

12-11

MySQL判断非空和非空函数

12-11

mysql 删除字段的实现示例

12-11

MySQL实际项目中常用的 DDL 模板

12-11

MySQL 备份与还原理论与实战案例全解析

12-11

MySQL 机器重启后gtid_executed初始化流程解析

12-11

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论