2014-05-09 19 views
0

我怎樣才能使此代碼更快。當我插入100條記錄到我的數據庫時很好,但是插入我們說的500K條記錄需要很長時間。 我試過在我的代碼中使用implode,但它不工作。 代碼似乎有兩個foreach循環,一個在另一個內部,但我找不到一種方法使其工作,有沒有人有一個想法? 我的框架是codeigniter。foreach INSERT到Mysql數據庫是非常慢的,特別是當插入超過100K記錄和

下面的代碼是什麼樣子:

<?php 
function Add_multiple_users($values) 
{ 
    $err = ''; 
    foreach($values as $rows) 
    { 
     $clientQuery = 'INSERT INTO 
          client 
          (
           admin_id, 
           create_time 
          ) 
          VALUES 
          (
           "'.$this -> session -> userdata('user_id').'", 
           "'.date('Y-m-d H:i:s').'" 
          )'; 
     $clientResult = @$this -> db -> query($clientQuery); 
     if($clientResult) 
     { 
      $client_id = $this -> db -> insert_id(); 
      foreach($rows as $row) 
      { 
       $attrQuery = 'INSERT INTO 
            client_attribute_value 
            (
             attribute_id, 
             client_id, 
             value 
            ) 
            VALUES 
            (
             "'.$row['attribute_id'].'", 
             "'.$client_id.'", 
             "'.addslashes(trim($row['value'])).'" 
            )'; 
       $attrResult = @$this -> db -> query($attrQuery); 
       if(!$attrResult) 
       { 
        $err .= '<p class="box error">Could not add attribute for<br> 
          Attribute ID: '.$row['attribute_id'].'<br> 
          Client ID: '.$client_id.'<br> 
          Attribute Value: '.trim($row['value']).'</p>'; 
       } 
      } 
     } 
    } 
    return $err; 
} 
?> 

這是我已經試過:

   $attrQuery = "INSERT INTO client_attribute_value (attribute_id, client_id, value) VALUES "; 

       $vls = array(); 
       foreach($rows as $row) { 
        $myattribute_id = $row['attribute_id']; 
        $myclient_id = $row[$client_id]; 
        $myvalue = addslashes(trim($row['value'])); 
        $vls[] = " ('$myattribute_id ', '$myclient_id ', '$myvalue ')"; 


        $attrQuery .= implode(', ', $vls); 

        $attrResult = @$this -> db -> query($attrQuery); 

客戶表樣本: client table sample

client_attribute_value表樣本: client_attribute_value

+0

沒有工作批量插入?或者你有什麼問題?順便說一下,什麼時間很長?分鐘?小時? 500k行是相當數量的數據 – Chococroc

+0

500K記錄可能需要長達2小時在我的服務器上。我認爲我試過hungs的代碼是因爲我添加了一個數組(),因爲第一個foreach循環將數據插入到客戶端表中,但每個循環的第二個循環都會停止代碼。我只是試圖使用implode選項更快地將插入插入數據庫 – chap

+0

您每個用戶有多少屬性?我會首先重寫腳本並使用佔位符準備好的語句。在foreach之前準備語句**,綁定參數並在循環內執行語句。在你的內部foreach做一個插入與多個值。 – VMai

回答

1

回答我自己的問題,希望這有助於別人未來。

在笨的模型PHP文件/框架補充一點:

$this->db->trans_start(); 

    MY CODE 

$this->db->trans_complete(); 

問題就迎刃而解了。 :) 它加快我的INSERTS記錄到數據庫約。 15秒紀錄30秒。

+0

這是如何幫助你? –

0

我的猜測是,您正在與數據庫建立多個連接,嘗試打開一個連接併爲所有更改保留打開的資源,然後只在流程結束時關閉它。

+0

你有一個想法如何做到這一點,我的應用程序是在一個Codeiginiter框架 – chap

+0

我不知道這個框架,但是,如果你看看它的代碼(如果你有一個未壓縮的代碼),也許你會發現一個mysql_connect語句,它會返回一個資源,試圖保留這個資源,並避免不必要的經常性連接 –