我遇到了一个脚本问题,该脚本应该使用另一个表中另一个日期字段的值填充一个日期字段。 (正在填充的表包含超过 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/