如何优化MySQL UPDATE请求?

时间:2016-01-20 14:12:27

标签: php mysql

我正在尝试更新表格中的100K行。但查询执行得非常慢。 一些数学函数不在SQL中,因为使用了PHP,例如asinh

<?php
 $n = pow(2, 6);
$sql = "";
$dsn = 'mysql:host=localhost;dbname=****';
$user = '****';
$password = '****';
try {
    $dbh = new PDO($dsn, $user, $password);

} catch (PDOException $e) {
    echo $e->getMessage();
}
try {
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->beginTransaction();
    $stmt = $dbh->query('SELECT id, lat FROM data');

       while ($row = $stmt->fetch())
            {
                 $idRow = $row['id'];
                $latRow = $row['lat'];    
                 $y = floor(1 - asinh(tan(deg2rad($latRow))))/2*$n;
                 $sql .= " UPDATE data_update";
                 $sql .= " SET  ySet= '" . $y . "'";
                 $sql .= " WHERE ";
                 $sql .= "id = " . $idRow . "; ";
            }
   $dbh->exec($sql);    
} catch (Exception $e) {
    $dbh->rollBack();
    echo $e->getMessage();
}
?>

2 个答案:

答案 0 :(得分:0)

尝试在id上添加索引。

<p>

答案 1 :(得分:0)

对于插入,您只能在一个语句中对多个插入进行分组,从而提高了性能。在这种情况下,我找到的唯一解决方案是: 1)如果你知道会有重复的结果,则会对重合结果进行分组,这样你就可以按结果($ ids [$ y] [] = $ newId)将分组的id保存在数组中,然后每组内爆并执行一次(更新xxx,其中id为(implode(&#39;,&#39;,$ ids [$ y]))。但是当它们浮动时,我不确定它是否会起作用,或者如果它会缩短插入时间。

2)其他可能的改进可能是在文件中写句子(每500个语句执行一次file_put_contents,不要忘记使用FILE_APPEND)然后从mysql控制台执行文件加载&gt; source /我的/文件/路径;

后一种解决方案更简单,它可能会改善你的表现,而前者则不然。