MySQL ALTER TABLE ORDER BY f1 DESC - 这会阻止SELECT查询吗?

时间:2010-12-17 23:36:28

标签: mysql locking sql-order-by alter

我有一个MySQL MYISAM表(比如说tbl),包含2个无符号的int字段,比如f1和f2。 f2上有一个索引,表格非常大(大约320,000,000+行)。我定期更新此表(每周大约有100,000个新行),并且,为了能够在不执行ORDER BY的情况下搜索此表(这在实时查询中非常耗时),我对表进行了物理排序根据我想要检索其行的方式。

因此,我执行ALTER TABLE tbl ORDER BY f1 DESC。 (我知道服务器上有足够的物理空间来存放表的副本。)我已经读过,在此操作期间,会创建一个临时表,并且SELECT语句不会影响当前行。

但是,我遇到过这种情况并非如此,并且表中与ALTER表同时发生的SELECT语句被阻止并且不会终止。在ALTER TABLE tbl完成后(生产服务器上大约40分钟),tbl上的SELECT语句再次开始执行。

有什么理由说“ALTER表tbl ORDER BY f1 DESC”似乎阻止其他客户端查询tbl?

1 个答案:

答案 0 :(得分:0)

更改表格将始终锁定表格,阻止SELECT运行。

我会管理员,我甚至不知道你可以用ALTER TABLE做到这一点。

你想从桌子上得到什么?例如,给定范围内的所有记录? 3.2亿行不是一个微不足道的数字。我会给你我的直觉反应:

  1. 切换到InnoDB(允许#2,也提供交易,但没有#2可能会影响性能)
  2. 对表格进行分区(使其表现得像一些略小的表格)
  3. 考虑重新设计,例如具有“工作集”表和“历史”表,基本上是手动分区。如果您经常查找最近插入的数据,这(以及分区)将有很大帮助。如果你的查找是均匀分布的,这可能不会有所作为。
  4. 考虑添加一个可以结合使用的新列,以缩小选择范围(因此,不要搜索日期,搜索日期和客户ID)
  5. 由于我不知道你要存储什么,其中一些(如#4)可能不适用。

    您还可以尝试其他一些事情。 OPTIMIZE TABLE可以帮助你,但花费更少的时间,但我对此表示怀疑。我认为在内部它实现为转储/重新加载,至少在InnoDB方面。