2016-01-20 2 views
0

Я пытаюсь обновить строки 100K в таблице. Но запрос выполняется очень медленно. Некоторые математические функции не в SQL, так как используется PHP, пример asinhКак оптимизировать запрос MySQL UPDATE?

<?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

Попробуйте добавить индекс по идентификатору.

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

Для вставок вы можете группировать несколько вставок только в одном заявлении, улучшая производительность. В этом случае единственными решениями, которые я нахожу, являются: 1) результаты совпадения группировки, если вы знаете, что будут повторяющиеся результаты, поэтому вы можете сохранить в массиве сгруппированные идентификаторы по результату ($ ids [$ y] [] = $ newId), а затем взорвать и выполнить один раз для каждой группы (обновить xxx, где id in (implode (',', $ ids [$ y])). Но поскольку они являются плавающими, я не уверен, что это будет работать вообще , или если это уменьшит время для вставок.

2) Другие возможные улучшения могут заключаться в написании предложений в файле (выполнить файл_put_contents каждые 500 операторов или около того и не забудьте использовать FILE_APPEND), а затем выполнить загрузка файла с консоли mysql как> source/my/file/path;

Это последнее решение проще, и, вероятно, оно улучшит вашу производительность, а первое - нет.

Смежные вопросы