Php mysql批量查询

Php mysql批量查询,php,mysql,sql,Php,Mysql,Sql,在cron作业中,我必须查询一个表中超过100万行,并根据该查询向用户发送电子邮件。我的代码如下: $start = 0; $limit = 1000; while ( true) { $query_results = db_result("SELECT * FROM table LIMIT $start, $limit"); if (count($query_result) == 0) { break; } foreach ( $query_

在cron作业中,我必须查询一个表中超过100万行,并根据该查询向用户发送电子邮件。我的代码如下:

$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;
}
有没有更好更有效的方法批量查询数百万行?如果脚本崩溃以避免向人们发送重复的电子邮件?如果脚本崩溃并重新运行,它将向其余的人发送电子邮件,而无需我在上面的代码中进行db查找以检查每个人是否收到电子邮件


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

您需要在数据库中存储一些状态

在主表中,需要一个包含批处理(邮件)id和电子邮件id列的表

然后,对于发送的每封电子邮件,
在该表中插入一行,您可以将
选择
替换为:

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=?

如果您获取内存中的所有数据,则无需存储在mysql中。假设您的id已编制索引,以便获得所有id值,并将其保存在数组中,并使用您执行的php代码

像这样

  select * from table A where id >1000 limit 1000

然后在这个循环结束时,将值从1000增加到2000,这样直到到达结束。使用这种方法,你不需要在每次通过后更新数据库

我很想似是而非地否决这个问题。。。我认为我的电子邮件地址是这样的例行程序已经瞄准的数百万个地址之一,我不希望发送电子邮件的例行程序更高效。这就是为什么我要确保我不发送重复的邮件!