2011-12-26 82 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