php - 大表更新超时无错

标签 php mysql sql

我遇到了一个脚本问题,该脚本应该使用另一个表中另一个日期字段的值填充一个日期字段。 (正在填充的表包含超过 1.82 亿条记录)该脚本在大约一个小时后一直停止,没有产生任何错误。我尝试添加所有我能想到的超时异常,但无济于事。 (我必须使用动态设置,因为我无权访问数据库服务器来更改 .ini 设置)任何人都可以告诉我出了什么问题吗?这是我的代码,我们将不胜感激。

<?php
$dbname = "rismedia_newsletter";
include('db_connect.php');
ignore_user_abort(1);
set_time_limit(0);
ini_set('mysql.connect_timeout', 28800);
ini_set('default_socket_timeout', 28800);
ini_set('max_execution_time', 0);
ini_set('max_input_time', -1);
ini_set('memory_limit', -1);

$sql = "SELECT `ad_stats`.`id`, `newsletters`.`send_date` 
        FROM ad_stats 
            INNER JOIN newsletters ON (`ad_stats`.`newsletter_id` = `newsletters`.`id`) 
        WHERE `ad_stats`.`send_date` IS NULL 
           OR send_date = '0000-00-00 00:00:00' 
        GROUP BY `ad_stats`.`newsletter_id`";

$res = $db -> query($sql);
while ($row = $res -> fetch_assoc()) {
    $id = $row['id'];
    $send_date = $row['send_date'];
    if ($send_date > '') {
        $qupd = "UPDATE ad_stats SET send_date = '".$send_date."' WHERE id= ".$id;
        $upd = $db -> query ($qupd);
    } else { 
        continue; 
    }
}
?>

最佳答案

我会说您应该将它们合并到一个查询中以加快处理速度。

MySQL:

UPDATE 
    ad_stats a 
    JOIN newsletters b ON a.newsletter_id = b.id 
SET 
    a.send_date = b.send_date 
WHERE 
    a.send_date IS NULL OR 
    a.send_date = '0000-00-00 00:00:00'

Postgres:

UPDATE
    ad_stats
SET
    send_date = N.send_date
FROM
    ad_stats A
    INNER JOIN newsletters N ON A.newsletter_id = N.id
WHERE
    A.send_date IS NULL OR 
    A.send_date = '0000-00-00 00:00:00'

这样应该会快很多,但是如果一段时间后仍然失败,则可能是服务器设置问题,您说过您可能无法更改。如果是这种情况,您可能必须使用 LIMIT 以较小的批处理运行您的脚本,并多次运行它直到完成。它还可能有助于确保您拥有 ad_stats.newsletter_id 和 newsletters.id 的索引。

关于php - 大表更新超时无错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966018/

相关文章:

sql - 如何最好地存储和汇总每天、每周、每月的访问量以便快速检索?

php - 将主题上传到 Azure 上的 WordPress 时出错

php - 在 Symfony2 和 Twig 中为文件添加资源路径前缀

java - Hibernate 映射 MySQL SET 类型

mysql - SQL 连接 + 计数

c# - 桌面 C# SQL Server (LocalDB) 数据库访问模式

sql - ConstraintViolationException 在 JavaEE 中将应用程序部署到 Glassfish

php - 从表中获取 $_POST 变量

php - mySQL 查询连接关联表匹配 this AND this OR this

mysql - 哪个sql查询更快: multiple selects or join?