带WHERE条件查询transaction表时提示已崩溃需修复,无查询条件时正常
解决transaction表带WHERE条件查询崩溃的问题
核心原因分析
全表查询正常但带WHERE条件报错,大概率是transactionOid字段的索引损坏——全表扫描不依赖索引,而带条件查询会触发索引检索,索引损坏就会抛出崩溃报错。
可行解决方案
直接修复表及索引
执行MySQL修复命令,自动修复表结构和索引:REPAIR TABLE transaction;注:该命令对MyISAM引擎直接生效;如果是InnoDB引擎,此命令会自动重建表,等效于
ALTER TABLE transaction ENGINE=InnoDB;单独重建目标字段索引
先查看表的索引状态:SHOW INDEX FROM transaction;找到transactionOid对应的索引名(比如
idx_transactionOid),先删除再重建:DROP INDEX idx_transactionOid ON transaction; CREATE INDEX idx_transactionOid ON transaction(transactionOid);临时绕过索引验证问题
执行查询时强制忽略索引,验证是否因索引导致报错:SELECT * FROM transaction IGNORE INDEX(idx_transactionOid) WHERE transactionOid = '100/102022/1039';如果此查询正常返回结果,即可确认是索引损坏问题,按前两种方案修复即可。
长期优化建议
如果使用的是MyISAM存储引擎,建议迁移到InnoDB引擎——InnoDB有更好的崩溃恢复机制,能减少此类索引损坏问题:ALTER TABLE transaction ENGINE=InnoDB;
内容的提问来源于stack exchange,提问作者MOBUSSHAR ISLAM
相关产品推荐
相关产品推荐

