Workbench中SQL查询优化:统计日均步数3000-4000的用户总数
SQL查询优化方案
原查询的问题分析
- 外层
count(distinct user_id)完全冗余,子查询已通过group by user_id得到唯一user_id集合,直接count(user_id)即可 - 条件中
steps>'0'存在隐式类型转换(若steps为数值类型),会导致索引失效,且数值比较无需用单引号包裹 - 缺少针对性索引,导致分组计算时需扫描大量数据
优化后的SQL语句
SELECT COUNT(user_id) FROM ( SELECT user_id FROM `step_activity`.`step_activities` WHERE user_id BETWEEN '1100001' AND '9999999' -- 若user_id为数值类型,去掉单引号改为1100001、9999999 GROUP BY user_id HAVING ROUND(AVG(CASE WHEN steps > 0 THEN steps END), 0) BETWEEN 3000 AND 4000 ) AS custlt3k;
进一步性能优化建议
- 创建联合索引:针对查询模式创建
(user_id, steps)联合索引,数据库可直接通过索引完成分组与平均值计算,无需回表扫描全量数据CREATE INDEX idx_user_steps ON `step_activity`.`step_activities`(user_id, steps); - 统一数据类型:确保查询条件值的类型与字段类型一致,避免隐式类型转换导致索引失效
- 提前过滤数据:若业务允许,在WHERE子句中加入时间范围等过滤条件,减少分组处理的数据量
- 简化计算逻辑:若业务对精度要求不高,可去掉
ROUND函数直接用AVG(...) BETWEEN 3000 AND 4000,降低计算开销
内容的提问来源于stack exchange,提问作者Dheeraj Kumar
相关产品推荐
相关产品推荐

