Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何优化MySQL更新请求?_Php_Mysql - Fatal编程技术网

Php 如何优化MySQL更新请求?

Php 如何优化MySQL更新请求?,php,mysql,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)

我正在尝试更新表中的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();
}
?>

尝试在id上添加索引

ALTER TABLE`data\u update`添加主键(`id`);

对于插入,您可以在一条语句中对多个插入进行分组,从而大大提高了性能。在这种情况下,我找到的唯一解决方案是: 1) 分组一致性结果如果您知道将有重复的结果,那么您可以按结果($ids[$y][]=$newId)将分组的id保存在数组中,然后对每个组内爆并执行一次(更新xxx,其中id在其中(内爆(',',$ids[$y])).但由于它们是浮动的,我不确定这是否会起作用,或者这是否会减少插入的时间

2) 其他可能的改进可以是将句子写在一个文件中(每500条语句执行一个文件内容,不要忘了使用file\u APPEND),然后从mysql控制台以>source/my/file/path的形式执行文件加载


后一种解决方案更简单,可能会提高您的性能,而前一种解决方案则不然。

启动前10K,然后启动下一个10K,依此类推……分解该公式的作用,并在sql中实现它。