0

我有一个必须不时清理一次的 MyISAM 表(正在删除 12M 行中的大约 5M 行)。之后,我必须优化表,并且我知道如果我先删除索引,OPTIMIZE TABLE 会更快。问题是,

ALTER TABLE t1 DISABLE KEYS;
--> here
OPTIMIZE TABLE t1;
--> or here
ALTER TABLE t1 ENABLE KEYS;

MySQL 可能决定提供一些其他查询,这会导致多次缓慢的非索引表扫描,从而延迟进一步的步骤。

那么如何为其他线程锁定表呢?

4

2 回答 2

1
于 2013-05-17T12:10:55.423 回答
0

MyISAM 缺乏事务支持,因此不可能可靠地做到这一点(有很多 DDL 级别的操作会静默解锁)。这就是为什么你应该在晚上安排这样的维护,这样你就不会在繁忙时间赶上额外的负载。

但是,您有一个XY 问题- 您正在询问针对您遇到的问题的自行设计的解决方案,而不是要求为问题提供适当的解决方案。

解决潜在问题的替代方案是:

  • 更频繁地进行清理 - 在较小的批次中,负载不应该非常明显
  • 只在晚上做这OPTIMIZE一步,白天经常清理。
  • 由于您认为停机时间显然是可以接受的(因为您建议锁定自己),您甚至可以考虑在此期间临时重命名表格 - 这是一种确保没有其他人接触表格的史前方式,但它会起作用。

如果您更详细地描述您的实际问题,我们可能会提供更好的解决方案。

于 2013-05-17T11:59:36.977 回答