2016-05-05 7 views
0

Ich möchte eine Tabelle mit allen Links in einem anderen erstellen, aber der Prozess ist zu langsam, ich mache dies mit CodeIgniter, und ich möchte wissen, ob es ein besserer Weg, es zu tun.Wie optimiere ich Einfügen in CodeIgniter (Einfügen schneller)

Dies ist mein Code:

foreach($results as $value) { 
     $ci->db->select('id'); 
     $ci->db->where('url', $value->Url); 
     $link = $ci->db->get('links')->row(); 

     if(@!$link) { 
      $ci->db->insert('links', array(
       'title' => $value->Title, 
       'url' => $value->Url, 
       'description' => $value->Description, 
       'is_featured' => 0, 
       'published_date' => date('Y-m-d h:i:s') 
      )); 
      $link_id = $ci->db->insert_id(); 
     } else { 
      $link_id = $link->id; 
     } 


     $ci->db->where('link_id', $link_id); 
     $ci->db->where('term_id', $term_id); 
     $term_links = $ci->db->get('term_links')->row(); 

     if(!$term_links) { 
      $ci->db->insert('term_links', array(
       'link_id'=>$link_id, 
       'term_id'=>$term_id, 
       'order_link'=>$order, 
       'duplicates'=>0 
      )); 
     } else { 
      $ci->db->where('id', $term_links->id); 
      $ci->db->update('term_links', array('duplicates'=>$term_links->duplicates+=1)); 
     } 

     $order++; 
    } 

Jede Idee? Ich benutze activerecords statt SQL.

Vielen Dank im Voraus!

Antwort

1

Nun, Sie führen keine einzige Insert-Anweisung aus, die Sie ausführen viele Anweisungen einfügen und aktualisieren in einer Schleife. Überlegen Sie, Ihren Code zu Benutzer insert_batch

zu ändern. Batch erstellen generiert die Abfrage und führt sie alle gleichzeitig statt mehrerer einzelner Abfragen aus. Das beschleunigt die Dinge auf zwei Arten. Erstens: Es gibt nur eine Hin-und-Her-Kommunikation zwischen PHP und der DB statt mehrerer. Zweitens: Indexupdates werden nur einmal statt mehrmals durchgeführt.

+0

Vielen Dank! Ich habe gesehen, wie man die Funktion benutzt, und ich habe nur eine Frage, diese Funktion könnte die eingefügten IDs zurückgeben? weil ich die insert_id() -Funktion verwende, um die Zeilen zu erhalten, die ich eingefügt habe. Danke noch einmal! – Alan

+0

Mein Verständnis ist nein. Das liegt daran, dass das zugrunde liegende mysql last_insert_id() dies nicht unterstützt. http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-inser-id-id – e4c5

+0

Wenn Batch für Sie nicht funktioniert, mal sehen, was die Alternativen sind, aber Sie müssen Aktualisieren Sie Ihre Frage, indem Sie genauer angeben, was genau Sie tun möchten und wie Ihre Tabellen aussehen – e4c5

2

Der schnellste Mechanismus besteht darin, eine Textdatei CSV zu schreiben und ein LOAD DATA INFILE durchzuführen. Oft geht es in einen Worktable, der zuerst gelöscht wird. Dann erhält diese Tabelle einen Aufruf für das Einfügen von realTable (col1, col2, etc) Wählen Sie col1, col2 usw. aus workTable.

Dies ist der schnellste Weg.

So gibt es 2 Anrufe. Wenn dieser zweite Aufruf ein Insert mit Join-Muster ist, ist das in Ordnung.

Aber Schleife ist immer die langsame Straße.

Mit dieser Strategie wird das Looping in großem Umfang ausgeführt.

CI kann dies über rohe Abfragen durchführen. So wird jeder Kampf mit dem ORM leicht umgangen.

Verwandte Themen