выборка данных из таблицы накопительной суммы - PullRequest
0 голосов
/ 22 апреля 2020

Это моя основная таблица, в которой хранятся показы ключевых слов в соответствии с датами.

+---------+-----------+------------+-------------+
| 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, а левое соединение делает запрос крайне медленным.

У меня вопрос,

как я могу сделать это быстрее?

спасибо

1 Ответ

0 голосов
/ 27 апреля 2020

Это

  on second.keywordId = keyword.keywordId
 and second.reportDate = '2018-12-25'

необходимо

INDEX(keywordId, reportDate)  -- in either order

Примечание: может быть проще сказать

    '2018-12-21' - INTERVAL 3 DAY

вместо

    '2018-12-18'
...