【问题标题】:MySQL - Running multiple update queries over the same subset of large tableMySQL - 在大表的同一子集上运行多个更新查询
【发布时间】:2012-11-21 00:16:09
【问题描述】:

我有一个不断增长的大表(目前有 1400 万行并且还在增加)。它是来自日志的“错误”列表。其中一些错误是我想在上游修复时过滤的已知问题。在表中,我有两个位“CheckedForFilter”和“Filtered”,我想在 10,000 个行块中执行以下操作。

 1) Select on 10,000 rows (where 'CheckForFilter' is false)
 2) Run a series of queries that set the 'Filtered' bit in certain criteria is true
 3) After the last query runs set the 'CheckForFilter' bit to true

可以设置“过滤”位的查询列表目前为 5,但我认为随着时间的推移它会增长。我的核心问题是我不知道如何每次都选择相同的行集。我需要将查询保持在可管理的大小,因为运行时间过长的查询会延迟服务器复制。

【问题讨论】:

  • hmm.. 听起来可能有一个正则表达式模式可以进行过滤?如果有多种模式 - 那么您可以将它们存储在另一个表中,然后在游标中动态比较它们。
  • 另一种想法 - 对 CheckedForFilter 值中应用的过滤器进行一些按位指示(或将其更改为更多值)以指示已检查哪些过滤器 - 然后你就不会太在意相同的事情了每次运行都精确设置。

标签: mysql


【解决方案1】:

如果您的错误表中有 ID 字段,您可以这样做。

创建一个“过滤器”表,其中包含接下来要检查的 10,000 个 ID 的最小和最大 ID 值。在此表中有一个名为“已检查”的标志,用于确定是否已检查所有过滤器。

在错误表中的 ID 介于“已检查”字段 = 0 的“过滤器”表中的最小和最大 ID 值之间的情况下运行过滤器查询。

完成后,在“过滤器”表的最小和最大 ID 范围内更新这些记录上的 CheckedForFilters 标志。

更新“过滤器”表并将“已检查”字段设置为 1。如果您愿意,还可以存储日期和时间。

对接下来的 10,000 条记录运行此操作,直到完成。

这还可以让您保留过滤器运行时间的历史记录。如果您愿意,您还可以将每个批次运行的过滤器存储在单独的表中。

【讨论】:

  • 谢谢.. 我曾想过这样的事情,或者创建一个可以容纳 10,000 个键的表。我希望在发布请求时找到可以锁定一组行并在其上运行多个查询的东西,但这肯定会成为一个很好的替代方案
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 2019-08-21
  • 2021-11-11
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多