关键词COUNTHyperLogLog近似计数基数估算大数据摘要当表数据量达到千万甚至亿级时精确的COUNT(DISTINCT col)往往非常缓慢。本文介绍一种概率性算法——HyperLogLog它可以在极小的内存开销下估算唯一值的数量误差控制在2%以内。结合Redis、PostgreSQL等实现方式帮助数据分析师在超大表场景下快速获得近似统计结果。大家好我是小耶写功课只是为了我踩过的坑你们别再踩了上周讲了COUNT(*)优化今天聊一个更进阶的话题当我们需要统计唯一值数量如UV、独立用户数时传统的COUNT(DISTINCT col)在超大表下非常慢。这时可以用近似计数。1 名词解释HyperLogLog一种概率性算法用极小内存估算集合中唯一值的数量误差通常在2%以内。基数Cardinality集合中不重复元素的个数如UV、独立用户数。近似计数牺牲少量精度换取极致性能适合对精确度不敏感的场景。2 实际运用2.1 传统COUNT(DISTINCT)的问题SELECT COUNT(DISTINCT user_id) FROM orders;在千万级表中这个查询需要创建临时表去重内存不足会写磁盘耗时可能几十秒甚至分钟级。2.2 HyperLogLog 实现RedisPFADD daily_uv user123PFCOUNT daily_uv获取估算值。PostgreSQLCREATE EXTENSION hll;然后使用hll_add_agg等函数。金仓数据库兼容PostgreSQL的hll扩展用法相同。MySQL没有内置可以通过存储过程模拟或调用Redis。2.3 实战示例Redisbash# 添加用户ID PFADD uv_20260519 user123 user456 user789 # 获取估算UV数 PFCOUNT uv_202605192.4 适用场景适用运营大屏、趋势分析、预估报告对精确度不敏感允许1-3%误差。不适用财务结算、精准营销券发放等需要精确计数的场景。3 实测对比1000万UV方法耗时内存占用COUNT(DISTINCT user_id)25秒临时表巨大Redis HyperLogLog2毫秒12KB4 价值总结千万级COUNT(DISTINCT)可能耗时数十秒而HyperLogLog可将时间压缩到毫秒级内存占用仅KB级别。学会近似计数你就能在业务指标监控、用户行为分析等场景中用极低成本获取趋势数据避免数据库被压垮。如果业务可以接受2%左右的误差HyperLogLog是替代精确去重的绝佳方案。小耶在手SQL不愁。还有什么想了解的欢迎留言小耶一定知无不言言无不尽……我们下次见~参考文献[1] Redis官方文档HyperLogLog[2] PostgreSQL HLL扩展文档[3] 《高性能MySQL》第4版第7章“查询优化”
COUNT进阶:超大表的近似计数与HyperLogLog
发布时间:2026/5/20 19:34:46
关键词COUNTHyperLogLog近似计数基数估算大数据摘要当表数据量达到千万甚至亿级时精确的COUNT(DISTINCT col)往往非常缓慢。本文介绍一种概率性算法——HyperLogLog它可以在极小的内存开销下估算唯一值的数量误差控制在2%以内。结合Redis、PostgreSQL等实现方式帮助数据分析师在超大表场景下快速获得近似统计结果。大家好我是小耶写功课只是为了我踩过的坑你们别再踩了上周讲了COUNT(*)优化今天聊一个更进阶的话题当我们需要统计唯一值数量如UV、独立用户数时传统的COUNT(DISTINCT col)在超大表下非常慢。这时可以用近似计数。1 名词解释HyperLogLog一种概率性算法用极小内存估算集合中唯一值的数量误差通常在2%以内。基数Cardinality集合中不重复元素的个数如UV、独立用户数。近似计数牺牲少量精度换取极致性能适合对精确度不敏感的场景。2 实际运用2.1 传统COUNT(DISTINCT)的问题SELECT COUNT(DISTINCT user_id) FROM orders;在千万级表中这个查询需要创建临时表去重内存不足会写磁盘耗时可能几十秒甚至分钟级。2.2 HyperLogLog 实现RedisPFADD daily_uv user123PFCOUNT daily_uv获取估算值。PostgreSQLCREATE EXTENSION hll;然后使用hll_add_agg等函数。金仓数据库兼容PostgreSQL的hll扩展用法相同。MySQL没有内置可以通过存储过程模拟或调用Redis。2.3 实战示例Redisbash# 添加用户ID PFADD uv_20260519 user123 user456 user789 # 获取估算UV数 PFCOUNT uv_202605192.4 适用场景适用运营大屏、趋势分析、预估报告对精确度不敏感允许1-3%误差。不适用财务结算、精准营销券发放等需要精确计数的场景。3 实测对比1000万UV方法耗时内存占用COUNT(DISTINCT user_id)25秒临时表巨大Redis HyperLogLog2毫秒12KB4 价值总结千万级COUNT(DISTINCT)可能耗时数十秒而HyperLogLog可将时间压缩到毫秒级内存占用仅KB级别。学会近似计数你就能在业务指标监控、用户行为分析等场景中用极低成本获取趋势数据避免数据库被压垮。如果业务可以接受2%左右的误差HyperLogLog是替代精确去重的绝佳方案。小耶在手SQL不愁。还有什么想了解的欢迎留言小耶一定知无不言言无不尽……我们下次见~参考文献[1] Redis官方文档HyperLogLog[2] PostgreSQL HLL扩展文档[3] 《高性能MySQL》第4版第7章“查询优化”