2017-01-30 6 views
0

私は別のテーブル参照IDに基づいて大きなテーブルレコードを更新/挿入します。

という3つのテーブルを持つ内部在庫システムを持っています。株式 - CSVファイルから毎日更新されます。

--------------------------------- 
| id | MODELNO | Discount | MRP | 
--------------------------------- 
| 1 | MODEL_1 | 40%  | 900 | 
| 2 | MODEL_A | 20%  | 600 | 
--------------------------------- 

毎日このテーブルは、データが商人のCSVファイルからインポートされ切り捨てられ、新しい銘柄である。(6万のレコードの周り)

B。布は、マスター - マスターの服のデータベースを

---------------------------------------- 
| ref_id | MODELNO | Name  | MRP | 
---------------------------------------- 
| 80  | MODEL_1 |Some Dress | 900 | 
| 81  | MODEL_A |Another Dress| 600 | 
---------------------------------------- 

MODELNOref_id主キーユニークです。この表は内部在庫アプリケーションの一部です(約450万レコードあり)

cです。 Inventoryテーブル - それは株式に基づく内部アプリケーション

------------------------------------------------- 
| id | ref_id | Name  | MRP | status  | 
------------------------------------------------- 
| 1 | 80  |Some Dress | 900 | ACTIVE | 
| 2 | 81  |Another Dress| 600 | INACTIVE | 
-------------------------------------------------- 

この表は、製品の利用可能在庫を保存する、の一部だと割引が40%を超える製品がデフォルトINACTIVEによって他ACTIVEある場合場合。

必要な機能は毎日、株価表レコードをループするスクリプトを実行する必要があり、MODELNO在庫表の在庫を更新することです。在庫表のレコードが存在しない場合は、追加される。

今まで私が試したことは、PHPスクリプトです。 a。まず、すべてのレコードのインベントリテーブルのステータスをINACTIVEに設定します。 b。また、株式表の各レコードについて、MODELNOがCloths Masterテーブルに存在するかどうかを確認します。 b。レコードが存在する場合は、ref_idを取得し、それに応じてインベントリテーブルと更新/挿入レコードにref_idが存在するかどうかを確認します。

問題は、スクリプトが完了するまでに8時間以上かかることです。

あなたは上記の機能を実装するのに使用できる効率的な方法を提案できますか?

注: インベントリテーブルへのすべての挿入と更新は、CodeIgniterの一括挿入/更新機能を使用して実行されます。 在庫DBに存在しない商品が少ないため、すべてのステータスをINACTIVEに設定します。

+0

ヒント: '%'は保存しないでください。 – Strawberry

+0

それを行うだろう、btw私はDBにCSVファイルをダンプするMySQLのロードインラインを使用している。また、MODELNOのインデックスを追加しました。ref_idフィールド – epynic

答えて

0

トリガーを使用しない理由は何でしょうか?

so_inventory

CREATE TABLE `so_inventory` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `ref_id` INT(11) NOT NULL DEFAULT '0', 
    `Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `MRP` INT(11) NOT NULL DEFAULT '0', 
    `status` TINYINT(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 
COLLATE='uft8_general_ci' 
ENGINE=MyISAM 
AUTO_INCREMENT=1 
; 

そして最後にテーブルso_cloths

CREATE TABLE `so_cloths` (
    `ref_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `MODELNO` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `Name` VARCHAR(255) NOT NULL DEFAULT '0' COLLATE 'uft8_general_ci', 
    `MRP` INT(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ref_id`) 
) 
COLLATE='uft8_general_ci' 
ENGINE=MyISAM 
AUTO_INCREMENT=1 
; 

そして今、テーブルのトリガ

を作成し、テーブルso_stocks

CREATE TABLE IF NOT EXISTS `so_stocks` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `MODELNO` varchar(50) COLLATE uft8_general_ci NOT NULL DEFAULT '0', 
    `Discount` int(10) DEFAULT '0', 
    `MRP` int(11) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=uft8_general_ci; 

INSERT INTO `so_stocks` (`id`, `MODELNO`, `Discount`, `MRP`) VALUES 
    (1, 'MODEL_1', 40, 900), 
    (2, 'MODEL_A', 20, 600); 

を作成します。 0

so_clothsに何かを挿入するたびに、挿入がso_inventoryに行われます。

明らかに、データをso_stocksまたはso_clothsに挿入した後に挿入するかどうかは、決定する必要がありますが、この例では洞察が得られるはずです。

トリガーステートメントの定義者を設定に変更する必要があります

+0

ありがとう、試して戻ってきますが、その間に挿入を遅くすることはありませんか?もちろん – epynic

+0

- しかし、それらは間違いなくPHPのクエリよりも高速です – sintakonte

関連する問題