2016-01-20 181 views
0

我正在嘗試更新表中的100K行。但是查詢執行起來非常緩慢。 有些數學函數是不是在SQL,因爲使用PHP,例如asinh如何優化MySQL更新請求?

<?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(); 
} 
?> 
+0

消滅第一個10K,然後下一個,等等...... –

+1

分解那些公式在sql中執行的操作。 – Mihai

回答

0

嘗試在ID添加索引。

ALTER TABLE `data_update` ADD PRIMARY KEY(`id`); 
0

對於插入,您可以將多個插入僅分組到一個語句中,從而提高了性能。在這種情況下,我發現的唯一解決方案是: 1)如果您知道將要重複出現結果,則將重合結果分組,因此您可以通過結果($ ids [$ y] [] = $ newId),然後爲每個組implode並執行一次(update xxx where id in(implode(',',$ ids [$ y]))。但是因爲它們是浮動的,所以我不確定這一切都可以工作,或是否會縮短用於插入。

2)其他可能的改進可以在一個文件中書面方式的句子(執行file_put_contents每500個陳述或者所以,不要忘記使用FILE_APPEND),然後執行從mysql控制檯加載文件爲> source/my/file/path;

這後一種解決方案更簡單,它可能會提高你的表現,而前者不是。