Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Глобальный апдейт MySQL-базы в 5 Мб


Автор: Wolf1994 25.7.2006, 18:31
Пожалуйста, помогите найти оптимальное решение.

Есть MySQL-база, 3 тысячи полей. Требуется в каждом поле проапдейтить ячейку "dir". Сейчас эта ячейка содержит: "rus/dir1/dir2...". Надо заменить "rus" на "all", сохранив остальную часть записи. То есть, чтобы, например, вместо "rus/dir1/dir2" было "all/dir1/dir2".

У меня получилось так:
Код

 $sql="SELECT COUNT(id) AS 'c' FROM $table_name";
 $result=mysql_query ($sql, $connection) or die(mysql_error());
 $count=mysql_fetch_array ($result, MYSQL_ASSOC);
 $c=$count['c'];

 $howmuch=10;

 $q++;
 $sql="SELECT dir, id FROM $table_name ORDER BY id ASC LIMIT ".( ($q-1)*$howmuch ).",".($q*$howmuch);
 $result = mysql_query ($sql, $connection) or die(mysql_error());
 while ($row=mysql_fetch_array ($result, MYSQL_ASSOC))
  $temp [$row['id']]=$row['dir'];

 foreach ($temp as $k=>$v)
 {
  $v="all".substr ($v, 3);
  $sql="UPDATE $table_name SET dir='".$v."' WHERE id='".$k."'";
  $result=mysql_query ($sql, $connection) or die(mysql_error());
 }

 print 'Оки. Обработано: '.( ($q-1)*$howmuch )." - ".($q*$howmuch).' Стадия: '.$q.' из '.( floor ($c/$howmuch)+1 )."<br />";
 if ($q<floor ($c/$howmuch)+1)
 {
  print '<script type="text/javascript">'."\n";
  print "//<![CDATA[\n";
  print 'location.href="'.$_PHP['SELF'].'?q='.$q.'";'."\n";
  print "//]]>\n";
  print '</script>'."\n";
 }
 else
  print 'Усё готово!!!';


Скрипт апдейтит по 10 записей и снова вызывает себя.

Можно ли подобную операцию совершить проще и быстрее  smile  

Автор: -=Ustas=- 25.7.2006, 21:24
Цитата(Wolf1994 @  25.7.2006,  18:31 Найти цитируемый пост)
Можно ли подобную операцию совершить проще и быстрее  

Зачем такие заморочки с вызовом себя самого? Я бы просто написал его в консольном варианте и без разбиения. Он бы это выполнил быстрее. 

Автор: Wolf1994 25.7.2006, 22:54
В смысле - в консольном варианте?

Без разбиения у меня не получилось - превышается "maximum execution time limit" в 30 секунд. У себя на компьютере я его могу обойти, но не на сервере сайта. 

Автор: -=Ustas=- 26.7.2006, 08:49
Цитата(Wolf1994 @  25.7.2006,  22:54 Найти цитируемый пост)
превышается "maximum execution time limit" в 30 секунд

Делаешь на каждой итерации 
Код

set_time_limit(60) ;

и все! 

Автор: SamDark 26.7.2006, 08:58
UPDATE table SET dir=replace(dir, 'rus/', 'all/') 

Автор: -=Ustas=- 26.7.2006, 09:22
Цитата(Wolf1994 @  25.7.2006,  22:54 Найти цитируемый пост)
В смысле - в консольном варианте?

Если объемы работы большие, то может сам апач вывалиться, поэтому лучше для таких работ из под консоли делать.

Добавлено @ 09:26 
Цитата(SamDark @  26.7.2006,  08:58 Найти цитируемый пост)
UPDATE table SET dir=replace(dir, 'rus/', 'all/') 

Тоже как вариант... 

Автор: Wolf1994 26.7.2006, 15:37
SamDark, спасибо! Это именно то, что нужно! С меня "+".
Цитата

set_time_limit(60) ;

То есть я своим скриптом могу установить максимальное время его выполнения?!. 
...Ага, посмотрел:
Цитата

set_time_limit() has no effect when PHP is running in безопасный режим.

Мне это не подходит smile
Цитата

Если объемы работы большие, то может сам апач вывалиться, поэтому лучше для таких работ из под консоли делать.

Имеется ввиду, как админ хостинга? Или рядовой пользователь? 

Автор: -=Ustas=- 26.7.2006, 15:57
Цитата(Wolf1994 @  26.7.2006,  15:37 Найти цитируемый пост)
Имеется ввиду, как админ хостинга? Или рядовой пользователь? 

Ну это конечно если есть права на выполнение из-под шела smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)