1. 冗余索引(Redundant Index)的检测,idx_a 与 idx_a_b 的覆盖关系?
如何检测数据库中的冗余索引?以 idx_a 与 idx_a_b 为例说明二者的覆盖关系,以及冗余索引会带来哪些危害?
- 基于最左前缀原则判断索引之间的覆盖关系
- 冗余索引的检测工具与 SQL(MySQL sys.schema_redundant_indexes、pt-duplicate-key-checker)
- 冗余索引的危害:写放大、空间占用与优化器负担
冗余索引指某索引的键列被另一索引的键列完全覆盖(按最左前缀方向),删除后不影响任何查询。判断覆盖关系的核心是最左前缀:若索引 B 的键列序列以索引 A 的键列序列为前缀(如 idx_a_b(a,b) 以 a 开头,完全包含 idx_a(a)),且列序一致、类型一致,则 A 冗余。反之不成立:idx_a_b 不能被 idx_a 覆盖。
需要注意边界:若 idx_a 带有唯一约束(提供唯一性保证)或存在"仅用 a 列即可覆盖的查询"而 idx_a_b 因额外列更宽导致扫描成本不同,需按真实负载评估后再删。冗余索引的危害:每次 DML 多维护一棵 B-Tree(写放大)、占用磁盘与缓冲池内存、统计与优化器枚举空间增大,还可能让优化器在相似索引间犹豫导致计划抖动。检测可借助 MySQL 的 sys.schema_redundant_indexes 视图或 pt-duplicate-key-checker 工具,结合慢日志中从未被使用的索引(index_usage 统计)一起治理。
本题考查"覆盖关系"的精确判定:必须以最左前缀为准绳,同时保留"唯一约束、覆盖查询、列序类型一致"三个例外,防止误删。回答时先给判定法则,再给检测工具与危害,体现从原理到运维的完整认知。