我想创建一个包含另一个链接的表,但是进程太慢了,我使用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。
提前谢谢!
答案 0 :(得分:2)
最快的机制是写出文本文件CSV并执行LOAD DATA INFILE。通常它会进入首先清除的工作台。然后该表接收插入realTable(col1,col2等)的调用,从workTable中选择col1,col2等。
这是最快捷的方式。
所以有两个电话。如果第二个调用是带有连接模式的插入,那很好。
但循环将永远是缓慢的道路。
使用此策略将极大地执行循环。
CI可以通过原始查询执行此操作。因此,任何与ORM的斗争都很容易被规避。
答案 1 :(得分:1)
嗯,您没有执行单个insert语句,而是在循环中执行许多insert和update语句。请考虑将您的代码更改为用户insert_batch
插入批处理生成查询并一次运行它而不是多个单独的查询。这会以两种方式加快速度。第一:PHP和DB之间只有一次来回沟通而不是几次。第二:索引更新只发生一次而不是几次。