CodeIgniter大批量插入

时间:2012-07-11 05:48:38

标签: php mysql codeigniter batch-file insert

我目前正在创建一个批处理脚本,它调用多个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行。

4 个答案:

答案 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尝试保存查询以进行性能分析,如果禁用此功能,则可以获得大量时间。

如果您不喜欢这个答案,请不要低估。只是想帮忙。