Как оптимизировать этот отчет MySQL по времени и агрегации? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть система календаря для событий.Каждое событие имеет дату начала и дату окончания.Таким образом, довольно легко узнать, сколько событий активно в определенный день.

Однако составление отчета о событиях, активных каждый день, оказывается сложным за период в 10 лет и почти 200 000 событий.

Запрос, который я пробовал, выглядит следующим образом

select  calendar.day, count(*) 
from 
   calendar, events
where 
   event.startDate <= calendar.day
   and event.endDate>= calendar.day
group by day

Таблица календаря содержит 10 календарных дней.У меня есть индексы начала / окончания и дня.

200'000 событий за 10-летний период дают мне> 16 сек.Мне нужно это исправить.

Я не уверен, что это возможно сделать с помощью простой оптимизации запросов.

Очевидное решение, вероятно, состоит в том, чтобы изменять мой код и обновлять предварительно рассчитанную таблицу при каждом добавлении./ обновить / удалить событие.Другие идеи без изменения кода я не знаю.

1 Ответ

0 голосов
/ 14 декабря 2018

убедитесь, что у вас есть правильный индекс calendar.day тоже.

select  calendar.day, count(*) 
from  calendar
Inner join  events ON  
   event.startDate <= calendar.day
   and event.endDate>= calendar.day
group by day

и (не для производительности, а для ясности) не используйте старое имплицитное объединение, синтаксис используйте вместо этого явное объединение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...