2011-12-26 86 views
8

$this->db->insert_batch();是否插入1个表连接,还是插入每行分开招致打开连接开销?Codeigniter批量插入性能

+0

数据库连接应始终为1,无论是否为批处理。 – Usman 2011-12-26 14:01:18

回答

11

从代码点火器insert_batch的文档做这样的事情

$data = array(
    array(
     'title' => 'My title' , 
     'name' => 'My Name' , 
     'date' => 'My date' 
    ), 
    array(
     'title' => 'Another title' , 
     'name' => 'Another Name' , 
     'date' => 'Another date' 
    ) 
); 

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

// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date') 

因此,这将产生唯一一个所有值的查询,通常这种方式更快然后做单独的刀片。

6

要回答你的问题:它使用一个连接。

1

其实@RageZ基于文档的答案并不总是正确的。因为它完全基于您想要插入的项目数量。在查看codeigniter insert_batch()代码时,可以看到它们将批量插入切片为100个项目。

// Batch this baby (Around line number 1077 in codeigniter 2.x) 
for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) 
{ 
    $sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100)); 

    //echo $sql; 

    $this->query($sql); 
} 

这意味着,你的价值观将切片100S插入,如果你取消注释echo $sql部分你可以看到它的外观,当您使用插入批次101个项目等。因此,根据您的连接首选项,可能会有多个连接需要在db中插入。

+0

@ Ragez的答案可能是真实的,当问这个问题时,我想我使用的是CI 1.xx – 2014-02-14 11:28:13

+0

@amiawizard这可以是正确的,唯一的方法是确保看代码。据我所知他们没有改变这部分文件从1.x,但它可能代码已经从1.x更改为2.x – sobhan 2014-02-14 18:58:09

+0

@amiawizard我检查了1.7.1和1.7.3,并没有insert_batch函数他们似乎在2.x版中引入了这个函数https://github.com/EllisLab/CodeIgniter/blob/develop/user_guide_src/source/changelog.rst – sobhan 2014-02-14 20:56:48