我在表中有超过100万行,我必须查询并根据cron作业中的查询向用户发送电子邮件。我的代码如下:
$start = 0;
$limit = 1000;
while ( true) {
$query_results = db_result("SELECT * FROM table LIMIT $start, $limit");
if (count($query_result) == 0) {
break;
}
foreach ( $query_result as $result) {
$email = $result ['email'];
send_email($email);
}
$start += $limit;
}
是否有更好的方法可以批量查询数百万行?如果脚本崩溃以避免向人们发送重复的电子邮件?如果脚本崩溃并再次重新运行,它将向其余人发送电子邮件,而不必在上面的代码中进行数据库查找,以检查每个人是否收到了电子邮件?
电子邮件每天都会发送。根据每个人是否满足某些要求,它可能每天被发送给同一个人。
答案 0 :(得分:1)
您需要在数据库中存储一些状态。
您需要一个表格,其中包含批次(邮寄)ID的列和主表格中电子邮件的ID。
然后,INSERT
为每封发送的电子邮件添加一行到该表中,您可以将SELECT
替换为:
SELECT * FROM table WHERE id NOT IN (SELECT id FROM email_sent WHERE batch=?) LIMIT ?
或者,您可以添加一个列,说明电子邮件是否已发送(或何时发送)。然后,您首先将此批次的所有电子邮件添加到表中:
INSERT INTO batch_email (batch_id, email_id) SELECT ?,email.id FROM email WHERE ...
然后你选择要从那里发送的电子邮件:
SELECT * FROM table JOIN batch_email ON table.id=batch_email.id WHERE NOT sent LIMIT ?
最后,您在发送电子邮件后设置sent
:
UPDATE batch_email SET sent=true WHERE id=?
答案 1 :(得分:0)
如果获取内存中的所有数据,则无需存储在mysql中就可以执行操作。说您的ID已建立索引,因此您将获得所有ID值并将其保存在数组中,并使用php代码执行
喜欢
select * from table A where id >1000 limit 1000
然后在此循环的末尾将1000的值增加到2000,这样直到到达末尾。通过这种方法,您不需要在每次通过后更新数据库