我有一个MyISAM表,必须偶尔清理一次(12M行中总共约有5M行被删除)。 之后,我必须优化表,我知道如果我首先删除索引,OPTIMIZE TABLE会更快。 问题是,
ALTER TABLE t1 DISABLE KEYS;
--> here
OPTIMIZE TABLE t1;
--> or here
ALTER TABLE t1 ENABLE KEYS;
MySQL可能会决定提供其他一些查询,这会导致多次缓慢的非索引表扫描,从而延迟了进一步的步骤。
那么如何锁定其他线程的表?
答案 0 :(得分:1)
那么如何锁定其他线程的表呢?
您可以使用LOCK TABLES
:
LOCK TABLES t1 WRITE;
但是,如上所述:
如果您在锁定的表格上使用
ALTER TABLE
,它可能会解锁。例如,如果您尝试进行第二次ALTER TABLE
操作,则结果可能是错误Table 'tbl_name' was not locked with LOCK TABLES
。要处理此问题,请在第二次更改之前再次锁定表格。另请参阅Section C.5.7.1, “Problems withALTER TABLE
”。
答案 1 :(得分:0)
MyISAM缺乏事务支持,因此无法可靠地执行(有很多DDL级别的操作会以静默方式解锁)。这就是为什么你应该在晚上安排这样的维护,这样你就不会在繁忙的时间里承受额外的负担。
你有一个XY problem - 你问的是你自己设计的问题的解决方案,而不是要求正确解决问题。
解决潜在问题的替代方案是:
OPTIMIZE
步骤,并在白天经常进行清理。如果您更详细地描述实际问题,我们可能会提供更好的解决方案。