在SQL中运行查询需要花费大量时间。
总共有240000000行和7700000个唯一行。
试着计算用户在3000到4000之间的平均日步数。
select count(distinct user_id) from (SELECT user_id,ROUND(AVG(IF(steps>'0',steps,NULL)),0) AS `Average Steps`
FROM `step_activity`.`step_activities` where user_id between '1100001' and '9999999' group by user_id
having `Average Steps` between '3000' and '4000') as custlt3k;
1条答案
按热度按时间3z6pesqy1#
派生表(内部查询)中的
GROUP BY
使user_id
不同。因此,不需要DISTINCT
。请更改为简单的COUNT(*)
。请提供
SHOW CREATE TABLE
,以便我们查看是否有以user_id
开头的索引,这可能会有所帮助。此外,step_activities
中有多少行,以及user_id between '1100001' AND '9999999'
中有多少行。比较这些将确定是否使用该索引。该任务要求读取所有行,至少是具有该用户范围的行,并将其“分组”。
此索引 * 可能 * 有助于:
INDEX(user_id, steps)
,因为这将是一个“覆盖”索引。另一件要考虑的事情是--不要用
steps = 0
存储任何行。毕竟,它们在这个查询中会被丢弃。(也许行中还有其他需要保留的列?)