codeigniter从查询插入如何优化

时间:2013-09-10 08:41:20

标签: codeigniter insert

我想在codeigniter上优化我的查询。

此查询有效,但似乎需要时间将结果插入到我的数据库表中。

$this->db->select('client_id');
$this->db->from('event');       
$query = $this->db->get();  

foreach($query->result_array() as $row){
  $client_id = $row['client_id'];
  $data = array( 'event_id' => $event_id , 'client_id' => $client_id);          
  $this->db->insert('event_entry', $data);                  
}

我想知道是否有一种优化方式。

3 个答案:

答案 0 :(得分:3)

不进行n次插入,只需执行一次插入即可缩短执行时间。您可以使用insert_batch()在codeigniters活动记录中实现此目的。

$this->db->select('client_id');
$this->db->from('event');       
$query = $this->db->get();  

$data = array();

foreach($query->result_array() as $row){
  $client_id = $row['client_id'];
  array_push($data, array('event_id' => $event_id , 'client_id' => $client_id));          
}

$this->db->insert_batch('event_entry', $data); 

制作:

INSERT INTO event_entry (event_id, client_id) VALUES ('event_id', 'client_id'), ('event_id', 'client_id'), ...

答案 1 :(得分:2)

将所有代码替换为:

$this->db->query("
INSERT INTO event_entry (event_id, client_id)
SELECT ?, client_id
FROM event
", array($event_id));

你会清楚地注意到执行时间的不同:)另外在我看来,需要担心的代码较少。

此查询无法从Active Records运行,但它应该是非常自我解释的。与普通SELECT一样,如果每client_id行提取$event_id和已定义的值event。然后,它会获取这些值,INSERT将它们转换为event_entry

请注意,?array($event_id)会将值插入查询转义(并且安全)。除非您知道自己在做什么,否则永远不要在SELECT {$event_id}, client_id中插入查询。

Jeemusu的解决方案确实是通过Active Records实现这一目标的一种很好的方式,但如果它是你想要的性能,那么在这种情况下,一个查询比两个查询快。

答案 2 :(得分:0)

您可以使用insert_batch命令将数据插入数据库。使用foreach循环生成数据数组,然后使用insert_batch数据库。http://ellislab.com/codeigniter/user-guide/database/active_record.html

如果您需要任何帮助,请告诉我