我目前正在创建一个批处理脚本,它调用多个PHP脚本(使用CodeIgniter)从一个数据库中提取数据,处理结果并将结果插入另一个数据库。首先,我知道这可能不是这项工作的最佳工具,但它现在必须要做。 但回到主题,脚本运行正常,性能非常好,除了一种方法。它从第一个DB中提取数据,并将其插入第二个DB。这是一个包含大约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行。
答案 0 :(得分:5)
试试这个
// 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 :(得分:2)
使用事务 - 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();
答案 2 :(得分:0)
尝试使用
$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查询。 这样,如果发生了某些错误或超时,您可以随时重新启动。
数据库是否在同一台服务器上?然后你可以使用一个查询来复制来自其他数据库的数据(如果同一个用户有权访问这两个数据库)
答案 3 :(得分:0)
这是一篇很老的帖子,但是对于那些在寻找答案时来到这里的人来说,这个链接可能会对你有所帮助。
$ this-&gt; db-&gt; save_queries = FALSE;
http://greeneggmedia.com/blog/entry/undocumented-codeigniter
在后台CI尝试保存查询以进行性能分析,如果禁用此功能,则可以获得大量时间。
如果您不喜欢这个答案,请不要低估。只是想帮忙。