MySQL物理备份还原后,统计信息与B+树页结构错位导致优化器无法使用索引。执行`ALTERTABLEtFORCE`强制重建索引页,随后运行`ANALYZETABLE`更新统计信息可恢复性能。MyISAM表需用`REPAIRTABLEEXTENDED`。验证需确认Cardinality非零、EXPLAIN显示索引且唯一约束生效。
MySQL 使用中常遇到一个现象:通过 SHOW INDEX 能看到索引存在,但执行 EXPLAIN 分析查询计划时,key 显示为空,type 为 ALL(全表扫描)。这并非索引丢失,而是元数据与 B+ 树的物理结构不一致。若备份还原后未重建索引,优化器将无法识别索引的实际能力。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
MySQL 查询优化器的决策依据并非 SHOW INDEX 的输出,而是 Cardinality(来自 ANALYZE TABLE)和 .ibd 文件中的 B+ 树页布局。物理备份还原(如直接复制 .ibd 文件,或使用 mysqldump 还原时未加 --single-transaction 参数)可能引发以下问题:
Cardinality 全部变为 0 或 NULL,即使表中存在百万级数据行.ibd 文件中 LSN 出现断层,或残留未提交事务,导致 InnoDB 启动时跳过部分页的校验SHOW INDEX 读取数据字典(如 .frm 或 mysql.innodb_table_stats),而执行计划依赖内存中加载的页结构,两者不一致便引发问题使用 ALTER TABLE t ENGINE=InnoDB 重建索引属于隐式操作,MySQL 会尝试复用旧 .ibd 的页结构。若还原时已出现轻微损坏(如页校验失败或 LSN 不连续),MySQL 可能静默跳过异常页,导致新索引树不完整。
ALTER TABLE t FORCE 则不同,它等价于 DROP + CREATE + INSERT SELECT,强制全量重写所有数据页和索引页,绕过所有缓存和旧页解析逻辑。该方法对大表仍会锁表,但比 REPAIR TABLE 更可控。需要注意两点:
ALTER TABLE t FORCE 后必须立即执行 ANALYZE TABLE t,否则优化器仍沿用旧统计信息FORCE——仅写 ENGINE=InnoDB 在多数还原失效场景下无效MyISAM 的索引完全独立存储在 .MYI 文件中。ALTER TABLE 仅修改 .frm 并重写 .MYD,不会涉及 .MYI。若遇到 Incorrect key file for table 错误,需使用 REPAIR TABLE:
CHECK TABLE t 检查状态;若报错 record delete-link chain broken,需加 EXTENDED 参数REPAIR TABLE t EXTENDED 会逐行扫描 .MYD 并重建 .MYI,耗时较长且 IO 压力大SELECT @@tmpdir 指向的路径有足够空间,临时文件 t.TMD 大小约为原索引文件的两倍FLUSH TABLES 或重启 MySQL,否则缓存中的旧索引描述符仍会生效重建索引的目标是提升查询性能,而非仅让命令不报错。验证需分三步执行:
SHOW INDEX FROM t,确认 Cardinality 不为零且与实际行数规模匹配EXPLAIN SELECT * FROM t WHERE indexed_col = ,确认 key 列显示索引名,type 不为 ALLINSERT INTO t (indexed_col) VALUES (existing_value),必须返回 Duplicate entry 错误;若静默插入成功,则问题严重最后一步最容易被忽略。许多重建操作看似成功,但唯一性约束并未恢复。若不注意,后续业务可能引发重大异常。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述