0

現在、複数の PHP スクリプト (CodeIgniter を使用する) を呼び出して 1 つの DB からデータを取得し、結果を操作して別の DB に結果を挿入するバッチ スクリプトを作成しています。まず、これが仕事に最適なツールではないことはわかっていますが、今すぐ実行する必要があります。しかし、話題に戻ると、スクリプトは正常に実行されており、1 つのメソッドを除いてパフォーマンスはかなり良好です。最初の DB からデータを取得し、2 番目の DB に挿入します。約20列35000行のテーブルです。

これらの結果を挿入するために単純な$this->db->insert_batch('tablename', $insertdata);関数を使用していますが、どういうわけかスクリプトの実行には約 15 分かかります...

問題は、このプロセスを最適化する方法です。

前もって感謝します

編集

データが挿入される DB である 2 番目の DB にテーブルを作成するために使用するクエリを次に示します。

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
    }

そうすれば、行ごとに実行でき、1 つの巨大な SQL クエリに依存しなくなります。そうすれば、エラーやタイムアウトが発生した場合にいつでも再起動できます。

データベースは同じサーバー上にありますか? 次に、クエリを使用して、他のデータベースから選択してデータをコピーできます(同じユーザーが両方にアクセスできる場合)

于 2012-07-11T05:55:33.350 に答える