我有一个必须偶尔清理的MyISAM表(总共删除了1200万行中的500万行)。然后,我必须优化表,我知道如果我先删除索引,优化表的速度会更快。问题是,
ALTER TABLE t1 DISABLE KEYS;
--> here
OPTIMIZE TABLE t1;
--> or here
ALTER TABLE t1 ENABLE KEYS;MySQL可能会决定为其他一些查询提供服务,这会导致多次缓慢的非索引表扫描,从而延迟进一步的步骤。
那么我如何为其他线程锁定表呢?
发布于 2013-05-17 20:10:55
那么我如何为其他线程锁定表呢?
您可以使用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”。
发布于 2013-05-17 19:59:37
MyISAM缺乏事务性支持,因此这是不可能可靠地完成的(有很多DDL级操作将静默地解锁)。这就是为什么你应该在晚上安排这样的维护,这样你就不会在繁忙的时间赶上额外的负载。
你有一个XY problem --你问的是自己设计的解决方案来解决你遇到的问题,而不是问问题的适当解决方案。
解决根本问题的替代方案包括:
OPTIMIZE步骤,而在白天频繁执行清理。如果你能更详细地描述你的实际问题,我们也许能给出更好的解决方案。
https://stackoverflow.com/questions/16608312
复制相似问题