0

我有以下两个mysql(X和mode)表,结构如下

 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 行。我创建了一个 C# 桌面应用程序来使用以下查询更新表的op_mode列: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_fromtime_to范围永远不会重叠(否则您的架构将没有多大意义)。

在这种情况下,您应该使用 non-standard或使用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 回答