2016-05-05 12 views
0

他のリンクをすべて使用してテーブルを作成したいが、処理が遅すぎる、私はCodeIgniterでこれをやっている。それを行うより良い方法。CodeIgniterで挿入を最適化する方法(より速く挿入する)

これは私のコードです:

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++; 
    } 

任意のアイデア?私はSQLの代わりにactiverecordsを使用します。

ありがとうございます!

答えて

1

ループ内の多くの挿入および更新ステートメントを実行している単一の挿入ステートメントを実行していません。コードをユーザーに変更することを検討してくださいinsert_batch

バッチを挿入するとクエリが生成され、複数の個別のクエリではなくすべて一度に実行されます。それは2つの方法で物事をスピードアップします。まず、PHPとDBの間には、複数の通信の代わりに前後に通信する通信が1つしかありません。第2の理由:インデックスの更新は、数回ではなく1回だけ発生します。

+0

ありがとうございました!私は関数を使う方法を見て、私は質問だけを持っています、この関数は挿入されたIDを返すことができますか?挿入した行を取得するためにinsert_id()関数を使用するためです。再度、感謝します! – Alan

+0

私の理解はノーです。基本となるmysqlのlast_insert_id()はそれをサポートしていないからです。 http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id – e4c5

+0

バッチがあなたのために機能しない場合、代替案が何であるかを見てみましょう。正確に何をしようとしているのか、あなたのテーブルが何であるかをより明確にあなたの質問を更新してください。 – e4c5

2

最も速いメカニズムは、テキストファイルCSVを書き出し、LOAD DATA INFILEを実行することです。しばしば、最初にクリアされる作業テーブルに入ります。その後、そのテーブルは、realTable(col1、col2など)を選択し、workTableからcol1、col2などを選択するための呼び出しを受け取ります。

これは最速の方法で手をつないでいます。

したがって、2回の呼び出しがあります。その2番目の呼び出しが結合パターンの挿入であれば、それは問題ありません。

しかし、ループは常に遅い道になります。

この戦略を使用すると、大幅にループ処理が実行されます。

CIは、生のクエリによってこれを実行できます。したがって、ORMの闘いは簡単に回避されます。

関連する問題