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