SQL索引 - 这是重叠吗?

时间:2015-06-02 19:02:28

标签: sql sql-server indexing

我正在浏览并删除SQL数据库中的重复和冗余索引。

所以,如果我删除两个相同的索引。

如果我删除重叠索引,例如......

  • 指数1:品牌,型号
  • 指数2:品牌,型号,价格

我删除索引1。

如果索引的顺序相同但有额外的字段呢?

  • 指数1:品牌,型号
  • 指数2:品牌,价格,型号

我可以安全地删除索引1吗?

我的猜测不是,但我不确定

2 个答案:

答案 0 :(得分:6)

嗯,当然你可以放弃它;你似乎有权限。但是,索引不等同。

例如,第一个将优化此查询:

where brand = @brand and model = @model

第二个将能够使用索引,但不是最佳的,因为它不能直接寻找右行。引擎需要扫描索引中的所有@brand条记录以查找匹配的模型。因为这可以在索引本身中完成,所以应该具有相当好的性能。

这对您的查询是否重要取决于查询的性质,但索引不是多余的。

顺便说一句,我认为MySQL documentation在解释如何使用复合索引方面做得非常好(不同的数据库在索引使用方面并不完全相同,但它们非常相似)。

答案 1 :(得分:3)

不,删除它是不安全的。列的顺序和位置很重要。

在其他两列(pricebrand)之间引入model列是个问题。如果没有(brand,model)上的索引,则model值为"顺序为"在brand下。在price之前添加model列时,model值不再是"按顺序排列"。

例如,执行此操作的查询:

WHERE brand = 'foo'
  AND model >= 'bar' AND model <= 'cat'

可以有效利用(brand,model)

上的索引

它可以使用(brand,price,model)上的索引,但它只能对前导列brand执行范围扫描。在那之后,它所寻找的模型值可能是任何地方,在任何价格值下,所以索引效果较差。

如果您没有在(brand,model)中使用该索引的任何查询,那么放弃它是安全的。

此外,其中一些索引可能是&#34; UNIQUE&#34;索引用于强制执行唯一性,删除它们是不安全的,除非有不同顺序的相同列的等效索引。