0

好的,所以我有一个超过 130,000 行的 mysql 表。
我想做的是“重新生成”表格。我有一个名为 bind 的列,我希望它与 id 相同(即索引)。对于初始设置,绑定需要与 id 相同。就那么简单。使用的代码如下。我正在使用 PDO、类和函数。

$time_start = microtime(true); 
try{
    $sql = "SELECT * FROM `table_name`";
    $STH = $this->dbConn()->query($sql);
    $STH->execute();
    while($row = $STH->fetch(PDO::FETCH_OBJ)){
        if($row->id != $row->bind){
            $query = "UPDATE `table_name` SET `bind`=? WHERE `id`=?;";
            $STH2 = $this->dbConn()->prepare($query);
            $STH2->execute(array($row->id, $row->id));
        }
    }
} catch(PDOException $e) {
    $this->errorLog($e->getMessage());
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start)/60;
echo '<br /><b>Total Execution Time:</b> '.$execution_time.' Mins';

这是我执行的代码部分。$this->dbConn() 是我的数据库连接基类中的对象。

问题1.更新部分执行时间过长。但是,如果我只回显更新语句,则需要几秒钟。

问题 2. 我在执行时收到 500 内部服务器错误。不是 max_execution_time 限制。该脚本在后台以某种方式执行。我已将报告设置为 E_ALL,php.ini display_errors = On,并且在 /etc/php5-frm 日志文件的 /etc/logs/apache2 中的日志文件中找不到任何错误。

已解决,但有一些错误。也许我是个白痴。

while($row = $STH->fetch(PDO::FETCH_OBJ)){
            if($row->id != $row->bind){
            $query[] = "UPDATE `table_name` SET `bind`=`id`";
            }
        }
        $query = implode(';',$query).';';
        $STH2 = $this->dbConn()->exec($query) ; 

如果语句以“;”结束,PDO 知道批量插入。
我对 while 循环进行了一些修改以构建一个数组,然后将数组内爆以构建 sql 语句。
尽管如此,脚本仍会在几秒钟内执行,这非常好,但脚本并没有结束。你能看出我的代码有什么缺陷吗?代码正常执行,数据库已更新,所有 130000+ 行,但脚本在约 5 分钟后给了我 500 个内部服务器错误。

4

1 回答 1

1
UPDATE `table_name` SET `bind`=`id`
于 2013-08-11T10:34:39.000 回答