2017-10-24 15 views
2

私のコードでは、いくつかのデータを更新するためにforeachループを通してCASE WHEN文を作成します。一度に大きな更新要求がありますか?

私は100行以上のステートメントで終わるかもしれませんが、このような大規模な更新要求を一度に使用することが安全かどうかは疑問です。代わりに私の要求を小さな塊に分けるべきですか?

基本的にテーブルが次のように構成されています

CREATE TABLE 'table_example' (
'id' INT UNSIGNED NOT NULL , 
'attr_1' INT UNSIGNED NOT NULL , 
'attr_2' INT UNSIGNED NOT NULL , 
'attr_3' DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' , 
'attr_4' DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' , 
'attr_5' TINYINT UNSIGNED NOT NULL , 
'attr_6' TINYINT UNSIGNED NOT NULL , 
'attr_7' TINYINT UNSIGNED NOT NULL , 
'attr_8' SMALLINT UNSIGNED NOT NULL , 
'attr_9' VARCHAR(50) NOT NULL , 
'attr_10' SMALLINT UNSIGNED NOT NULL , 
'attr_11' TINYINT(1) UNSIGNED NOT NULL , 
'attr_12' TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
INDEX 'idx_id' ('id' ASC)) 
ENGINE = MyISAM DEFAULT CHARSET=utf8;` 

が一度構築され、文は次のようなものに見えるかもしれませんCASE:MySQLでの私の経験では

CASE attr_1 
WHEN id = 1 THEN 5 
WHEN id = 2 THEN 8 
... // could be hundreds more lines here 
ELSE attr_1 
END, 
CASE attr_2 
WHEN id = 1 THEN 96 
WHEN id = 2 THEN 45 
... // could be hundreds more lines here 
ELSE attr_2 
END, 
... // and so on for each attribute` 
+1

テーブル構造、使用されたストレージエンジン、および使用されたクエリを知らなくても、私たちはアンサーできません。 –

+0

あなたが求めるデータを追加しました。あなたは今、投稿でそれをチェックすることができます。 – Duddy67

+0

case文をビルドして使用することは、あなたがしようとしていることを行う正しい方法であるとは思われません。 attr_、id&intの三つ組の表を塗りつぶし、結合ごとに更新します。さらに、intを取得することのどれが有益にDBMSで行うことができるのか不思議に思うかもしれません。 – philipxy

答えて

0

は、それが制限することが賢明です文字数でのクエリのサイズ照会文字数を10K - 20K文字以下にすると効率が上がります。同時に、バッファがオーバーフローする危険はありません。

大きなクエリはなぜ効率的ですか? InnoDBの世界では、それぞれの単一のクエリは本質的に単一のトランザクションであるためです。行ごとに実行される一括更新は、行ごとに1つのトランザクション(コミット)を生成できます。それは物事を遅くする。

効率を得るための別の方法は、単一のトランザクションで、あなたの更新操作をラップすることです:時間の多くがCOMMITで消費されているので

START TRANSACTION; 
UPDATE something SET col='val' WHERE id='id'; 
UPDATE something SET col='val' WHERE id='id'; 
UPDATE something SET col='val' WHERE id='id'; 
COMMIT; 

これは時間を節約できます。しかし、トランザクションに何十万もの操作を入れてしまうと、膨大なトランザクションでサーバーを揺るがすことになります。

関連する問題