0

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

4

4 回答 4

8

尝试这个

// 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条数据保持交易。就这些。对不起,我英语不好。

于 2014-12-26T06:10:13.110 回答
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();
于 2012-07-11T08:54:38.683 回答
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 查询。这样,如果发生错误或超时,您可以随时重新启动。

数据库是否在同一台服务器上?然后,您可以使用查询从其他数据库中选择复制数据(如果同一用户可以访问两者)

于 2012-07-11T05:55:33.350 回答
0

这是一篇旧帖子,但是对于那些在寻找答案时登陆这里的人来说,这个链接可能会对您有所帮助。

$this->db->save_queries = FALSE;

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

在后台 CI 尝试保存查询以进行分析,如果禁用此功能,您可以获得大量时间。

如果您不喜欢这个答案,请不要投反对票。只是想帮忙。

于 2015-06-15T12:26:26.370 回答