Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL COUNT函数

MySQL中COUNT函数的使用小结

作者:AA-代码批发V哥

在MySQL的数据统计场景中,COUNT()函数是使用率极高的工具,无论是统计表中记录总数,还是按条件聚合计数,它都能轻松胜任,下面就来详细的介绍一下

前言

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

您可能感兴趣的文章:
阅读全文