SELECT table_name, redundant_index_name, dominant_index_name
FROM sys.schema_redundant_indexes
WHERE table_schema = 'shop';

表上五个索引,(a)、(a,b)、(a,b,c) 三个互为前缀,写入 TPS 从 1800 掉到 1050,慢日志里 insert 耗时翻了一倍。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,每个二级索引都要单独维护一棵 B+ 树,写入时同步更新,前缀重复的索引做的是同一件事。优化器选索引时也会被干扰,选出选择性更差的那个。

「冗余索引」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:用 sys.schema_redundant_indexes 查出互为前缀的索引;保留覆盖最长的那个 删掉被它包含的短索引;删除前先在从库跑一遍 确认没有查询依赖;再用 pt-index-usage 看真实使用情况。

改完只确认一件事:索引个数降下来 insert 耗时回到原来水平 TPS 恢复到 1800 附近。

作者 9823189