我有一个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?
答案 0 :(得分:0)
更改表格将始终锁定表格,阻止SELECT运行。
我会管理员,我甚至不知道你可以用ALTER TABLE做到这一点。
你想从桌子上得到什么?例如,给定范围内的所有记录? 3.2亿行不是一个微不足道的数字。我会给你我的直觉反应:
由于我不知道你要存储什么,其中一些(如#4)可能不适用。
您还可以尝试其他一些事情。 OPTIMIZE TABLE可以帮助你,但花费更少的时间,但我对此表示怀疑。我认为在内部它实现为转储/重新加载,至少在InnoDB方面。