簡體   English   中英

CodeIgniter大批量插入

[英]CodeIgniter large batch insert

我當前正在創建一個批處理腳本,該腳本調用多個PHP腳本(使用CodeIgniter)從一個數據庫中提取數據,使用結果並將結果插入另一個數據庫中。 首先,我知道這可能不是工作的最佳工具,但現在必須這樣做。 但是回到主題上,除了一種方法之外,腳本可以正常運行,並且性能非常好。 它從第一個數據庫中提取數據,並將其插入第二個數據庫中。 該表大約有20列和35000行。

我正在使用一個簡單的$this->db->insert_batch('tablename', $insertdata); 函數插入這些結果,但是不知何故腳本需要大約15分鍾的時間來執行...

問題是,如何優化此過程?

提前致謝

編輯

這是我用來在第二個數據庫上創建表的查詢,該數據庫是數據插入到的數據庫。

CREATE TABLE IF NOT EXISTS `invoices` (
    `invoice_number` varchar(40) NOT NULL,
    `shippinglist_number` varchar(40) DEFAULT NULL,
    `shippinglist_line` varchar(255) DEFAULT NULL,
    `customer_id` varchar(5) NOT NULL,
    `deptor` varchar(5) NOT NULL,
    `vat_number` int(255) DEFAULT NULL,
    `invoice_date` date NOT NULL,
    `expire_date` date NULL DEFAULT NULL,
    `currency_code` varchar(10) NOT NULL,
    `subtotal` decimal(19,4) NOT NULL,
    `vat` decimal(19,4) NOT NULL,
    `total` decimal(19,4) NOT NULL,
    `qty` int(10) NOT NULL,
    `partcode` varchar(255) NOT NULL,
    `description` text,
    `price` decimal(19,4) NOT NULL,
    `pieces_per` int(10) NOT NULL,
    `article_customer` varchar(255) DEFAULT NULL,
    `reference_customer` varchar(255) DEFAULT NULL,
    `sales_line_1` text,
    `sales_line_2` text,
    `sales_line_3` text,
    `memo` text,
    KEY `invoice_number` (`invoice_number`,`customer_id`,`deptor`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

該查詢只是一個普通的插入,但是將35000行切成100個行集。

嘗試這個

// some $datas

$this->db->trans_start();

$_datas = array_chunk($datas, 300);

foreach ($_datas as $key => $data) {
    $this->db->insert_batch('table', $data);
}

$this->db->trans_complete();

您拆分數組。 300、300、300 ....(mysql建議插入微小數據)。 和insert_batch! 每300個數據保持交易。 就這些。 對不起,我英語不好。

使用事務-1次提交總是比350次提交快。

編輯:

基本上,您需要執行以下操作:

// Fetch (and transform, I suppose) data from Sybase
// ...

$this->db->trans_start();

// Put your $this->db->insert_batch() calls here

$this->db->trans_commit();

嘗試使用

$x = $this->db->num_rows();
for($i=0;$i<$x;$i=$i+30)
    {
    $this->db//query stuff
    $this->db->limit($i);
    $other->db->//insert stuff
    }

這樣,您就可以逐行執行此操作,而不必依賴一個龐大的sql查詢。 這樣,如果發生了某些錯誤或超時,您可以在任何時候重新啟動。

數據庫是否在同一服務器上? 然后,您可以使用查詢從其他數據庫中選擇一個內容來復制數據(如果同一用戶可以訪問兩個數據庫)

這是一篇舊文章,但是對於那些在尋找答案的同時登陸此處的人,此鏈接可能會對您有所幫助。

$ this-> db-> save_queries = FALSE;

http://greeneggmedia.com/blog/entry/undocumented-codeigniter

在后台CI中,嘗試保存查詢以進行性能分析,如果禁用此功能,則可以節省很多時間。

如果您不喜歡這個答案,請不要投票。 只是想提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM