SQL 索引 - 这是重叠的吗?

SQL Index - is this overlapping?

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

因此,如果我有两个相同的索引,我会删除。

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

我删除了索引 1。

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

我能否安全地删除索引 1?

我猜不是,但我不确定

好吧,你当然可以放弃它;你似乎有权限。但是,索引并不相同。

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

where brand = @brand and model = @model

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

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

顺便说一句,我认为 MySQL documentation 很好地解释了如何使用复合索引(不同的数据库在索引使用上并不完全相同,但它们相当相似)。

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

在其他两列(brandmodel)之间引入 price 列是问题所在。如果没有 (brand,model) 上的索引,model 的值是 brand 下的 "in order"。在 model 之前添加 price 列后,model 值不再是 "in order".

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

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

可以有效利用(brand,model)

上的索引

它可以在 (brand,price,model) 上使用索引,但它只能在前导列 brand 上进行范围扫描。在那之后,它正在寻找的模型值可能是 anywhere 下,在任何价格值下,因此该索引不太有效。

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


此外,其中一些索引可能是 "UNIQUE" 用于强制唯一性的索引,删除这些索引是不安全的,除非存在具有不同顺序的相同列的等效索引。