我想在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);
}
我想知道是否有一种优化方式。
答案 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
如果您需要任何帮助,请告诉我