我正在浏览并删除SQL数据库中的重复和冗余索引。
所以,如果我删除两个相同的索引。
如果我删除重叠索引,例如......
我删除索引1。
如果索引的顺序相同但有额外的字段呢?
我可以安全地删除索引1吗?
我的猜测不是,但我不确定
答案 0 :(得分:6)
嗯,当然你可以放弃它;你似乎有权限。但是,索引不等同。
例如,第一个将优化此查询:
where brand = @brand and model = @model
第二个将能够使用索引,但不是最佳的,因为它不能直接寻找右行。引擎需要扫描索引中的所有@brand
条记录以查找匹配的模型。因为这可以在索引本身中完成,所以应该具有相当好的性能。
这对您的查询是否重要取决于查询的性质,但索引不是多余的。
顺便说一句,我认为MySQL documentation在解释如何使用复合索引方面做得非常好(不同的数据库在索引使用方面并不完全相同,但它们非常相似)。
答案 1 :(得分:3)
不,删除它是不安全的。列的顺序和位置很重要。
在其他两列(price
和brand
)之间引入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;索引用于强制执行唯一性,删除它们是不安全的,除非有不同顺序的相同列的等效索引。