【问题标题】:fetching data from cumulative-sum table从累积和表中获取数据
【发布时间】:2020-04-22 20:11:21
【问题描述】:

这是我的主表,它根据日期存储关键字展示次数。

+---------+-----------+------------+-------------+
| 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'

但有时,特定日期没有数据,查询返回 0 行。但这意味着对于特定日期,展示次数为 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 表有 500 万行,关键字表有 300k 个不同的“keywordId”,左连接会使查询非常慢。

我的问题是,

我怎样才能让它更快?

谢谢

【问题讨论】:

标签: mysql optimization cumulative-sum


【解决方案1】:

这个

  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'

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2013-12-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多