[英]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.