2014-12-12 3 views
0

Я выполняю упражнение ранжирования для значений в моей базе данных. Каждый столбец составляет год и каждый имеет 76 значений (т. Е. 76 строк под каждым годом). Годы с 1980 по 2035 год. Мой сценарий должен проходить каждый год (колонка) по очереди и ранжировать значения (т. Е. Упорядочивать их в порядке возрастания, а затем выплевывать связанные идентификаторы).Оценка значений столбцов в базе данных MySQL

Я написал сценарий ниже, и он работает, но это занимает три секунды, которые, я думаю, очень медленные. Для первого столбца (1980) это быстро, так как я могу вставить их за один раз. Для остальных я не могу, так как мне нужно ОБНОВИТЬ таблицу и, следовательно, сопоставлять строки - это приводит к отдельному SQL-запросу для каждого значения.

Есть ли лучший способ сделать это? Вот мой код:

for ($x = 1980; $x <= 2035; $x++) { 
    $sql="SELECT `ID`,`$x` FROM marginal_costs ORDER BY `$x`"; 
    $concat = ""; 
    $counter = 1; 
    $result = mysqli_query($con,$sql); 

    while($row = mysqli_fetch_array($result)) { 
     if($x==1980) { 
      $concat = $concat."('".$row['ID']."'), "; 
     } else { 
      $upload="UPDATE `merit_order` SET `$x`='".$row['ID']."' WHERE `ID`='$counter';"; 
      echo $upload; 
      mysqli_query($con, $upload); 
      $counter= $counter + 1; 
     } 
    } 

    if($x==1980) { 
     $concat = substr_replace($concat, "", -2).";"; 
     $upload="INSERT INTO `merit_order` (`$x`) VALUES $concat;"; 
     mysqli_query($con, $upload); 
    } 
} 
+0

Вы выполняете большой запрос в базе данных, это не странно, что он медленный O.o – Jordy

+0

плюс наличие таких столбцов не очень хороший дизайн. почему не просто общая колонка «год»? Не рассматривайте БД так, как если бы это была электронная таблица. –

+0

Я не благодарен за нижний план. То, как я это делаю, явно неэффективно, поскольку я выполняю смехотворное количество запросов вместо одного большого запроса. Должен быть лучший способ сделать это (возможно, построив массив). На данный момент это работает медленнее, чем скажем, сопоставимый скрипт в excel. – Noobster

ответ

1

Ваш код отправляет большое количество SQL-запросов в вашу базу данных, создавая ненужную связь. Это одна вещь, которую вы могли бы оптимизировать ... Два варианта:

  • Вы пишете хранимую процедуру, чтобы сделать все это, поэтому вы немного оптимизируете связь, но вы даете дополнительную работу своему дБ;
  • Попробуйте минимизировать количество используемых SQL-запросов: попытайтесь извлечь данные один раз (вы строите большой выбор, где вы выбираете все, все годы); сделать рейтинг в php; затем создайте несколько обновлений (например, для каждого идентификатора) и вставок и отправьте их в db; и все готово :)
+0

Спасибо, это именно тот ответ, который я искал. Я закончил реализацию решения, очень похожего на предложенное. – Noobster

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