2016-12-08 3 views
0

Каков наилучший способ для SELECT all from MYSQL DATABASE_1 почти каждый элемент редактировать (разделять, объединять, проверять формат электронной почты, проверять формат URL и т. Д.) - используя php, а затем INSERT INTODATABASE 2.Выберите, отредактируйте, а затем вставьте данные в новую базу данных

В старом столе имеется почти 3 миллиона строк.

Если у меня есть foreach для каждой строки (это не очень хорошая идея :)) требуется более 1 часа для 2 тысяч строк.

Если вставить несколько строк в одном запросе:

INSERT INTO tbl (col1, col2, ...) VALUES (item1, item2, ...), (item3, item4, ...) 

это почти то же самое

Любые идеи, как сделать это профессионально и быстро?

+1

Потому что мне нужно редактировать почти каждый предмет. как я уже сказал, проверить, заменить что-то, расколоть что-то. Это мусор из не проверенных входов. – user3700786

+0

mysql - как написано в первой строке сообщения;) – user3700786

ответ

0

Вы можете выполнить подкачку запроса и использовать несколько php-процессов. Например, процесс извлекает и редактирует 100000 элементов вставки в новую БД.

Для его реализации вы можете создать процесс родительскую PHP, который распределяет нагрузку на дочерние процессы, что-то вроде этого:

$total_rows = //Get from your mysql table 
$offsets = [] 
$limit = 10000; 

//Create offsets to process in bulk 
for ($i=0 ; $i<$total_rows ; $i++) { 
    $offsets[] = ($i * limit); 
} 

//Process rows 
while ($processed_rows < $total_rows) 

    $pids = []; 

    //Create 10 childs processes 
    for ($i=0;$i<10;$i++) { 
     if ($pid) { 
      $pids[] = $pid; 
     } else { 

      //Get next offset to process 
      $offset = array_shift ($offsets); 
      process_and_insert_row($offset, $limit); //this function gets, edits and inserts items 
     } 
    } 

    //Wait for childs to finish 
    foreach ($pids as $pid) { 
     pcntl_waitpid($pid, $status); 
     $processed_rows += $limit; 
     unset($pids[$pid]); 
    } 
} 

Предупреждение: Код не проверял, но я думаю, что это демонстрирует идею за объяснением ...

+0

Это кажется логичным. Я попробую. Спасибо. – user3700786

+0

Сделайте только 1000 за раз - иначе вы можете продуть ОЗУ на PHP. [_More discussion_] (http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks) фрагментации. –

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