我有一个事件日历系统。每个事件都有开始日期和结束日期。 因此,很容易知道某一天有多少事件事件。
然而,事实证明,针对 10 年期间和近 200'000 个事件生成每天活跃事件的报告具有挑战性。
我尝试的查询如下所示
select calendar.day, count(*)
from
calendar, events
where
event.startDate <= calendar.day
and event.endDate>= calendar.day
group by day
日历表包含 10 年日历日。我有开始/结束日期和日期的索引。
10 年期间的 200'000 个事件给了我 > 16 秒的时间。 我需要把它放下。
我不确定是否可以通过简单的查询优化来做到这一点。
明显的解决方案可能是更改我的代码并在每次添加/更新/删除事件时更新预先计算的表。不改变代码的其他想法我不知道。
最佳答案
确保您也有正确的索引 calendar.day 。
select calendar.day, count(*)
from calendar
Inner join events ON
event.startDate <= calendar.day
and event.endDate>= calendar.day
group by day
并且(不是为了性能而是为了清晰起见)不要使用旧的隐式连接语法 使用显式连接代替
关于mysql - 如何优化此 MySQL 报告查询的时间范围和聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53779343/