我有一个包含多个索引的表,其中几个重复相同的列:
Index 1 columns: X,B,C,D Index 2 columns: Y,D Index 3 columns: Z,D
我对实践中的索引知识不是很了解,所以我想知道是否有人可以解释为什么X,Y和Z与这些相同的列配对. B是生效日期.对于特定生效日期,C是该表的半唯一密钥ID.D是标识该标识符C的该记录的优先级的序列.
为什么不创建6个索引,每个X,Y,Z,D一个?
我想在另一个列T中添加一个索引,但在某些情况下我只会单独查询T而在其他情况下我也会指定B,C和D列…所以我应该只创建一个索引以上或我应该为T创建一个,为T(B,D)创建一个?
谷歌搜索索引的全面报道时,我没有像预期的那样运气.我能通过解释和B-tree索引的大量例子的任何资源?
解决方法
具有索引的规则是索引可用于过滤构成用于该索引的列的前缀的任何列列表.
换句话说,当我们过滤X和B,或X,B和C,或只是X或全部四个时,我们可以使用索引1.
但是,我们不能使用索引来过滤“中间”.这是因为索引的工作并不完全不同于为每行连接这些列的值,并对结果进行排序.如果我们知道我们正在寻找的东西开始,我们可以找出索引中的位置 – 就像进行二进制搜索时一样.
这就是单个索引不好的原因:如果我们需要过滤B,D以及X,Y和Z之一,我们需要三个索引; X,Y作为仅仅过滤Y的索引并不好,因为我们正在寻找的值的前缀 – X – 是未知的.
正如丹尼尔所提到的,覆盖索引是重复B,C和D的可能解释:即使D从未被过滤,也可能是我们需要您在索引中看到的列,然后我们可以只需从索引中读取列,而不是仅使用索引来定位行.