Оператор UPDATE занимает слишком много времени

Ну, у меня есть эта проблема, с которой я надеялся, что кто-то может мне помочь:

Так о чем это?

У меня есть разработанный PHP-скрипт, который импортирует файлы XML из папки в базу данных.

XML-файл выглядит следующим образом: XML-файл

В основном скрипт хранит информацию из файла XML в 5 таблицах, и это работает правильно. Но проблема в том, что мой файл не содержит информации об идентификаторах игроков в объекте PLAYER, поэтому после того, как я импортирую все в базу данных, мне нужно выполнить этот запрос:

  $sql = "SELECT igraci.ID, utakmice.Player_ID, utakmice.ID AS broj FROM igraci LEFT JOIN utakmice ON (igraci.Team_ID = utakmice.Team_ID) AND (igraci.Surname = utakmice.Lastname) AND (igraci.Name = utakmice.Firstname);";
$tabela = mysql_query($sql);

$row = mysql_fetch_assoc($tabela);
$totalrow = mysql_num_rows($tabela);
$i=0;
do {
    $i++;
    $sql = "UPDATE utakmice SET Player_ID=" . $row['ID'] . " WHERE ID = " . $row['broj'] . "";
    echo $sql."<br>";
   mysql_query($sql);
} while ($row = mysql_fetch_assoc($tabela));

Оператор select выполняется очень быстро, и у меня нет проблем с этим, но команда UPDATE делает тайм-аут скрипта. Я попытался сделать поля, используемые в этом запросе, индексами, но это не помогло, и как только у меня будет более 2200 строк, сценарий выйдет из строя. Сценарий работал нормально на старой версии php, но в прошлом месяце нам пришлось обновиться до 5.3, и вот тут-то и началась проблема. Есть ли способ ускорить это ОБНОВЛЕНИЕ?

PS: XML-файл взят из системы FIBA ​​live Cms.


person iGoogle    schedule 30.04.2014    source источник
comment
вы можете использовать LIMIT 1 в запросе на обновление, если у вас есть только одна запись для ID в таблице. уменьшит время выполнения sql   -  person Satish Sharma    schedule 30.04.2014


Ответы (3)


Время ожидания php-скрипта истекло?

Вам нужно сделать это как SELECT, за которым следует потенциально большое количество обновлений?

Не могли бы вы просто использовать один оператор UPDATE, что-то вроде этого: -

UPDATE utakmice
INNER JOIN igraci
ON (igraci.Team_ID = utakmice.Team_ID) 
AND (igraci.Surname = utakmice.Lastname) 
AND (igraci.Name = utakmice.Firstname)
SET utakmice.Player_ID = igraci.ID
person Kickstart    schedule 30.04.2014

Добавьте INDEX к utakmice.ID, чтобы ускорить часть WHERE.

Если вы не уверены в производительности:

EXPLAIN SELECT * FROM utakmice WHERE ID = [x]

Посмотрите, использует ли он индекс или выполняет полное сканирование таблицы (индекс хороший, сканирование таблицы медленное)

person Halcyon    schedule 30.04.2014

Помимо установки индекса для ID, вы можете попробовать группировать свои обновления, как описано в здесь.

Вам нужно подготовить запрос, объединив case-when, когда это необходимо. Это стоит попробовать, но я не проводил никаких тестов производительности, чтобы увидеть, может ли это дать вам огромный прирост.

В итоге вы получите что-то вроде:

UPDATE utakmice SET title = CASE
    WHEN id = <your_first_broj_from_result> THEN <your_first_id_from_result> 
    WHEN id = <your_second_broj_from_result> THEN <your_second_id_from_result> 
    ...
END
WHERE id IN (<your_first_broj_from_result>, <your_second_broj_from_result>,...)
person mareckmareck    schedule 30.04.2014