【发布时间】:2015-01-22 16:15:36
【问题描述】:
SELECT COUNT(DISTINCT r.id)
FROM views v
INNER JOIN emails e ON v.email_id = e.id
INNER JOIN recipients r ON e.recipient_id = r.id
INNER JOIN campaigns c ON e.campaign_id = c.id
WHERE c.centre_id IS NULL;
...或者,“我们打开了多少独特的电子邮件?(在一般活动中)”
目前在 Amazon RDS 实例上运行大约需要一分半钟。所涉及的表的总行数大致为:
- 广告系列:250
- 收件人:330,000
- 浏览量:530,000
- 电子邮件:1,380,000
解释给我:
1 SIMPLE r index PRIMARY UNIQ_146632C4E7927C74 767 NULL 329196 Using index
1 SIMPLE e ref PRIMARY,IDX_4C81E852E92F8F78,IDX_4C81E852F639F774 IDX_4C81E852E92F8F78 111 ecomms.r.id 1 Using where
1 SIMPLE v ref IDX_11F09C87A832C1C9 IDX_11F09C87A832C1C9 111 ecomms.e.id 1 Using where; Using index
1 SIMPLE c eq_ref PRIMARY,IDX_E3737470463CD7C3 PRIMARY 110 ecomms.e.campaign_id 1 Using where
我能做些什么来更快地得到这个总数?
【问题讨论】:
-
我不明白 r.id 如何代表打开的电子邮件,也不明白为什么需要
DISTINCT。考虑添加一些示例数据来说明问题。 -
对不起,我的问题的措辞不清楚:“打开唯一电子邮件”不是打开电子邮件的计数,而是打开电子邮件的唯一收件人的计数。因此,查询需要计算收件人 ID——尽管正如 John Bollinger 在下面指出的那样,我可以通过计算 emails.recipient_id 来节省自己的连接。我需要
DISTINCT,因为收件人可能会多次打开一封电子邮件,我想打折。 -
收件人记录何时创建?我想你知道你在用 INNER JOIN 做什么。如果您依靠 email.recipient_id 代替,您可能会记录没有匹配的收件人记录。您通常应该为这类问题提供示例数据和所需的输出,否则,我们必须假设您知道您在使用查询做什么。
标签: mysql count distinct innodb