增强mysql大表更新

时间:2013-02-26 07:45:39

标签: c# mysql sql-update

我有以下两个具有以下结构的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

2 个答案:

答案 0 :(得分:0)

这取决于'模式'的行数。如果它相对较少(少于100),那么你可能最好迭代代码中的每一行并直接更新到X

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

此查询将按时使用索引并且速度更快。

对于新数据,最好通过X上的插入触发器设置op_mode。

答案 1 :(得分: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);