我有一个 MySQL MYISAM 表(比如 tbl),它由 2 个无符号整数字段组成,比如 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 table tbl ORDER BY f1 DESC”似乎阻止其他客户端查询 tbl 有什么原因吗?