如何在CodeIgniter中优化插入(插入更快)

时间:2016-05-05 02:58:48

标签: php mysql 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++;
    }

有什么想法吗?我使用activerecords而不是SQL。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

最快的机制是写出文本文件CSV并执行LOAD DATA INFILE。通常它会进入首先清除的工作台。然后该表接收插入realTable(col1,col2等)的调用,从workTable中选择col1,col2等。

这是最快捷的方式。

所以有两个电话。如果第二个调用是带有连接模式的插入,那很好。

但循环将永远是缓慢的道路。

使用此策略将极大地执行循环。

CI可以通过原始查询执行此操作。因此,任何与ORM的斗争都很容易被规避。

答案 1 :(得分:1)

嗯,您没有执行单个insert语句,而是在循环中执行许多insert和update语句。请考虑将您的代码更改为用户insert_batch

插入批处理生成查询并一次运行它而不是多个单独的查询。这会以两种方式加快速度。第一:PHP和DB之间只有一次来回沟通而不是几次。第二:索引更新只发生一次而不是几次。