Это моя основная таблица, в которой хранятся показы ключевых слов в соответствии с датами.
+---------+-----------+------------+-------------+
| ID | KeywordId | ReportDate | Impressions |
+---------+-----------+------------+-------------+
| 3324620 | 969274443 | 2018-12-21 | 1 |
+---------+-----------+------------+-------------+
| 3334253 | 969274443 | 2018-12-22 | 0 |
+---------+-----------+------------+-------------+
| 3354119 | 969274443 | 2018-12-23 | 20 |
+---------+-----------+------------+-------------+
| 3373097 | 969274443 | 2018-12-24 | 11 |
+---------+-----------+------------+-------------+
| 3392168 | 969274443 | 2018-12-25 | 1 |
+---------+-----------+------------+-------------+
И это моя сводная таблица сумм, которая складывает показы изо дня в день
+----+-----------+------------+-------------+
| ID | keywordId | ReportDate | Impressions |
+----+-----------+------------+-------------+
| 1 | 969274443 | 2018-12-21 | 1 |
+----+-----------+------------+-------------+
| 2 | 969274443 | 2018-12-22 | 1 |
+----+-----------+------------+-------------+
| 3 | 969274443 | 2018-12-23 | 21 |
+----+-----------+------------+-------------+
| 4 | 969274443 | 2018-12-24 | 32 |
+----+-----------+------------+-------------+
| 5 | 969274443 | 2018-12-25 | 33 |
+----+-----------+------------+-------------+
, чтобы получить количество показов между датами 2018-12-21 и 2018-12-25, просто вычитаю
33 - 1 и получаю результат 22.
Я использовал приведенный ниже запрос, чтобы получить это результат.
select keyword.keywordId,(second.impressions - first.impressions) as imp from keyword
inner join diffreportkeyword as first on first.keywordId = keyword.keywordId
and first.reportDate = '2018-12-21'
inner join diffreportkeyword as second on second.keywordId = keyword.keywordId
and second.reportDate = '2018-12-25'
но иногда нет данных для указанной c даты и запрос возвращает 0 строк. Но это означает, что для указанной c даты показы равны 0.
Если я изменю это с левым соединением,
select keyword.keywordId,(second.impressions - first.impressions) as imp from keyword
left join diffreportkeyword as first on first.keywordId = keyword.keywordId
and first.reportDate = '2018-12-18'
left join diffreportkeyword as second on second.keywordId = keyword.keywordId
and second.reportDate = '2018-12-25'
это работает, но таблица diffreportkeyword имеет 5 миллионов строк, а таблица ключевых слов имеет 300k различных ключевых слов IDI, а левое соединение делает запрос крайне медленным.
У меня вопрос,
как я могу сделать это быстрее?
спасибо