0

次の構造を持つ次の2つのmysql(Xおよびモード)テーブルがあります

 table X
  `time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `op_mode` varchar(200) NOT NULL,
  `value` double NOT NULL,
  `processed` int(11) NOT NULL DEFAULT '0',
  KEY `time` (`time`),
  KEY `processed` (`processed`)

table mode 
`time_from` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `time_to` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `op_mode` varchar(500) CHARACTER SET utf16 COLLATE utf16_bin NOT NULL

テーブルXには約 1M 行が含まれます。次のクエリを使用してテーブルのop_mode列を更新する C# デスクトップ アプリを作成しました。X

UPDATE X, mode
SET X.op_mode = mode.op_mode,
    processed = 1
WHERE (X.TIME BETWEEN mode.time_from
                  AND mode.time_to
) AND processed = 0

ただし、更新プロセスには非常に長い時間がかかります。

更新プロセスを強化するための提案はありますか?

processedフラグとして使用される表の列X(最初は に設定され、行が更新される0と に設定されます)1

4

2 に答える 2

0

「モード」の行数によって異なります。比較的少ない (100 未満) 場合は、コード内の各行を反復処理して、X を直接更新するだけのほうがよいでしょう。

UPDATE X
SET X.op_mode = ?
    processed = 1
WHERE (X.TIME BETWEEN ? AND ?) 
AND processed = 0

このクエリは時間通りにインデックスを使用し、はるかに高速になります。

新しいデータの場合、X の挿入トリガーを介して op_mode を設定するのがおそらく最善でしょう。

于 2013-02-26T08:10:24.613 に答える
0

modeテーブルが比較的大きく、そのテーブルtime_fromの範囲が重複することはないと想定していますtime_to(そうしないと、スキーマがあまり意味がありません)。

その場合、mode非標準を使用するかKEY、または使用して、これらのフィールドのテーブルにインデックスを追加する必要があります

CREATE INDEX mode_time_from ON mode (time_from);
CREATE INDEX mode_time_to   ON mode (time_to);

それに加えて、次の複合インデックスを使用すると、速度がさらに向上するはずです。

CREATE INDEX x_processed_time ON X (processed, time);
于 2013-02-26T08:11:27.030 に答える