使用MySQL,1M记录表,存在索引“some_timestamp”。
WHERE 子句使用计算,以便可以对不同时间段的记录进行计数。
需要很长时间才能执行。
有更好、更快的方法吗???
这是当前代码:
set @now = now();
(SELECT
"45 Days" as "interval", count(*) as "thecount"
FROM blah.yada
where TIMESTAMPDIFF(day,some_timestamp,@now) <= 45
)
UNION
(SELECT
"90 Days" as "interval", count(*) as "thecount"
FROM blah.yada
where TIMESTAMPDIFF(day,some_timestamp,@now) > 45 and TIMESTAMPDIFF(day,event_timestamp,@now) <=90
)
UNION
(SELECT
"the rest" as "interval", count(*) as "thecount"
FROM blah.yada
where TIMESTAMPDIFF(day,some_timestamp,@now) > 90
)
最佳答案
在这种情况下,只需稍微修改一下你的逻辑就可以创造奇迹。
TIMESTAMPDIFF(day,some_timestamp,@now) <= 45
可以改为
some_timestamp >= @now - INTERVAL 45 DAY
等等与其余的比较。通过将计算移出字段,可以使用索引。
<小时/>此外,您也不需要多个查询和 UNION。
SELECT CASE WHEN some_timestamp >= @now - INTERVAL 45 DAY THEN "45 Days"
WHEN some_timestamp >= @now - INTERVAL 90 DAY THEN "90 Days"
ELSE "the rest"
END AS `interval`
, COUNT(*) AS `theCount`
FROM blah.yada
GROUP BY `interval`
;
关于使用计算的 where 子句的 MySQL 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153174/