@User782
Кратко о себе

Как упростить данный скрипт, слишком долго выполняется?

Суть, есть 5000 нужных id записей, которые нужно заменить
нужно на этих id в базе произвести замену, взяв из другой базы данные по порядку из id1,2,3...

//5000 нужных id записей на которых делаем замену
$array = array(
4,
120,
178,
...,
8000
);

$x = 1;
while ($x < 5000):

	$r = mysql_query("SELECT id, title, text FROM table_1 WHERE id_id = $x");

$rq = mysql_fetch_array($r);


mysql_query("UPDATE table_2 SET title = {$rq['title']}, text = {$rq['text']} WHERE id = '$array[$x]'");  
   
	 
	 $x++;  	 
	   
endwhile;


но такой скрипт выполняется очень долго.
Есть ли возможность не загружать данные 5000 записей в кеш для работы скрипта а по очереди проходить каждую замену?
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Сделать первичный индекс на вторую таблицу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Обновите одним запросом
https://www.mysqltutorial.org/mysql-update-join/

Но таймаут в минуту - маловато и в этом случае.

Чтобы ускорить перед обновлением добавьте временно композитный индекс на id, title, text на таблице, из которой читаете.
На таблице в которую пишете, на время вставки индексы лучше отключить.
Можете добавить условие типа where id>100 and id<500 и обновлять порциями, размер порции сами подберите постепенно увеличивая.

И да, mysql_query устарел лет 7 назад, Обновить СУБД и версию php пора бы.
Ответ написан
@rPman
первый вариант - генерируй sql скрипт вида
select ... from ... where id in (1,2,3,4,5,6....)
у этого способа ограничение на количество записей в скобках кажется 1000, так что в цикле генерируй (чуть чуть подправить твой скрипт)

второй вариант - идеологически более верный, создаешь временную таблицу в базе с одной колонкой id, заливаешь в нее твои идентификаторы, и затем одним запросом получаешь весь список записей
select ... from temp_ids a left join table_1 b on a.id=b.id
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы