作为DBA有多年的经验,我相信我知道这个问题的答案,但我认为从来没有伤害到我的基础.
假设我有一个表在列A和列B上有一个索引,而在列A,B和C上有一个第二个索引,那么丢弃第一个索引是安全的,因为第二个索引基本上会满足可以从第一个索引中获益的查询?
解决方法
这取决于,但答案通常是“是的,你可以把索引放在(A,B)’上.
在(A,B)上的索引对应的情况下(A,B)上的索引是执行约束的唯一索引;那么你不想将索引放在(A,B)上. (A,B,C)的索引也可以是唯一的,但唯一性是多余的,因为(A,B)组合是唯一的,因为其他索引.
但是在没有这种不寻常的情况下(例如,如果(A,B)和(A,C)都允许重复输入),则(A,B)索引在逻辑上是冗余的.然而,如果列C可能是“宽”(CHAR(100)列),而A和B较小(称为INTEGER),那么(A,B)索引比(A,C)更有效)索引,因为您可以获取(A,B)索引每页读取更多信息.所以,即使(A,B)是多余的,也许值得保留.您还需要考虑表的波动性;如果表很少发生变化,额外的指标并不重要;如果表更改很多,额外的索引会减缓对表的修改.这是否重要是难以猜到的?您可能需要进行性能测量.