我有一个PHP脚本,可以向一堆电子邮件地址发送简报,每小时发送15000个简报,直到所有电子邮件地址都被处理完毕。
因为这个过程不是一次运行的,所以我有一张桌子可以记录所有邮寄过的地址,所以我总能轻松获得未发送的地址。
以下是我所做的简化示例:
select a.*
from email_all a left outer join email_send s
on s.email_id = a.id
and s.mailing_id = 1
where s.id IS null
limit 0, 15000
因此,所有尚未邮寄的地址都被选中,现在的问题是,发送的简报越多,“email_send”表中记录的地址就越多,查询得到的速度就越慢。在一开始,'email_all'表中有50.000个地址,而'email_send'则没有,在我们的几个地址之后,'email_all'表中仍有50.000个地址,'email_send'中还有50.000个地址,然后全部地狱失败了。这些脚本适用于较小的邮件,例如10.000。
我在第二个表中的'email_id'列上放了一个索引,主键已经设置好了。
无论如何我可以加快速度吗?我也使用'NOT EXISTS IN',但这没有帮助:(
任何人都可以提供帮助吗?
THX !!
史蒂夫
答案 0 :(得分:0)
你为什么不以相反的方式做出反应:
答案 1 :(得分:0)
请勿记录已在其他表中发送的电子邮件地址。只需在email_all表中创建另一个字段,发送tinyint(1),并在发送该用户的电子邮件时更新该字段。或者制作一个大型队列表,并在发送时从那里删除行。