【问题标题】:enhancing mysql large table update增强mysql大表更新
【发布时间】:2013-02-26 07:45:39
【问题描述】:

我有以下两个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# 桌面应用程序来使用以下查询更新 X 表的 op_mode 列:

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

但是更新过程需要很长时间。

有什么建议可以加强更新过程吗?

X 表中的processed 列用作标志(最初设置为0,当行更新时设置为1

【问题讨论】:

    标签: c# mysql sql-update


    【解决方案1】:

    这取决于“模式”有多少行。如果它相对较少(少于 100 个),您可能最好遍历代码中的每一行并直接更新 X

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

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

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

    【讨论】:

      【解决方案2】:

      我假设表 mode 相对较大,并且该表中的 time_from-time_to 范围永远不会重叠(否则您的架构将没有多大意义)。

      在这种情况下,您应该使用非标准的KEY 或使用

      在这些字段的mode 表中添加索引
      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);
      

      【讨论】:

      • 感谢 mvp 的回复,我已经更改了我的数据库架构。不幸的是,它比以前花了更长的时间来更新
      猜你喜欢
      • 2015-06-28
      • 2011-04-07
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2011-10-11
      相关资源
      最近更新 更多