首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定MyISAM表进行维护

锁定MyISAM表进行维护
EN

Stack Overflow用户
提问于 2013-05-17 19:50:55
回答 2查看 146关注 0票数 0

我有一个必须偶尔清理的MyISAM表(总共删除了1200万行中的500万行)。然后,我必须优化表,我知道如果我先删除索引,优化表的速度会更快。问题是,

代码语言:javascript
复制
ALTER TABLE t1 DISABLE KEYS;
--> here
OPTIMIZE TABLE t1;
--> or here
ALTER TABLE t1 ENABLE KEYS;

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 20:10:55

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

您可以使用LOCK TABLES

代码语言:javascript
复制
LOCK TABLES t1 WRITE;

但是,如上所述:

如果在锁定的表上使用ALTER TABLE,它可能会变为解锁状态。例如,如果您尝试第二次ALTER TABLE操作,结果可能是错误Table 'tbl_name' was not locked with LOCK TABLES。要处理此问题,请在第二次更改之前再次锁定表。另请参阅Section C.5.7.1, “Problems with ALTER TABLE

票数 1
EN

Stack Overflow用户

发布于 2013-05-17 19:59:37

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

你有一个XY problem --你问的是自己设计的解决方案来解决你遇到的问题,而不是问问题的适当解决方案。

解决根本问题的替代方案包括:

  • 进行清理的频率要高得多-在较小的批次中,加载不应该只在晚上执行OPTIMIZE步骤,而在白天频繁执行清理。
  • 由于您认为停机时间显然可以接受(正如您建议的那样),您甚至可以考虑在停机期间暂时重命名表-这是一种确保没有其他人接触表的史前方式,但它会起作用。

如果你能更详细地描述你的实际问题,我们也许能给出更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16608312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档