2016-12-08 32 views
0

什麼是SELECT all from MYSQL DATABASE_1最好的辦法幾乎每一個項目編輯(分割,合併,驗證電子郵件格式,驗證URL格式等) - 通過使用PHP,然後INSERT INTODATABASE 2選擇,編輯,然後將數據插入到新的數據庫

舊錶有近300萬行。

如果我爲每一行做foreach(這不是個好主意:)),它需要2千多行1小時以上。

如果我在一個查詢中插入多行:

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中燒燬RAM。 [_More discussion_](http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks)分塊。 –

相關問題