mysql - 如何优化此 MySQL 报告查询的时间范围和聚合?

标签 mysql sql

我有一个事件日历系统。每个事件都有开始日期和结束日期。 因此,很容易知道某一天有多少事件事件。

然而,事实证明,针对 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/

相关文章:

php - 在单个查询中搜索逗号分隔的 MySQL 列中的多个值

php - 状态不发回到表单上?

java - 我应该如何从包含数据数组的 ListView 切换到新 Activity ?

php - Laravel:如何查询多个间接相关的表?

sql - CTE错误: "Types don' t match between the anchor and the recursive part"

MySQL 不会按链接分组

mysql - MySQL Workbench 中的正向工程数据库 - 错误 1304 : FUNCTION GET_NEXT_SEQ already exists

PHP:插入一行并选择插入行的ID

php - 如何将 x-number HTML 格式的项目添加到我的页面?

mysql - find_by_sql Ruby on Rails 3 没有结果