mysql批量查询

时间:2014-06-26 18:36:15

标签: php mysql sql

我在表中有超过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;
}

是否有更好的方法可以批量查询数百万行?如果脚本崩溃以避免向人们发送重复的电子邮件?如果脚本崩溃并再次重新运行,它将向其余人发送电子邮件,而不必在上面的代码中进行数据库查找,以检查每个人是否收到了电子邮件?

电子邮件每天都会发送。根据每个人是否满足某些要求,它可能每天被发送给同一个人。

2 个答案:

答案 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,这样直到到达末尾。通过这种方法,您不需要在每次通过后更新数据库