SQL索引-这是重叠的吗?
我将检查并删除SQL数据库中的重复索引和冗余索引 所以如果我有两个相同的索引,我会删除 如果我有重叠的索引,我会删除,例如SQL索引-这是重叠的吗?,sql,sql-server,indexing,Sql,Sql Server,Indexing,我将检查并删除SQL数据库中的重复索引和冗余索引 所以如果我有两个相同的索引,我会删除 如果我有重叠的索引,我会删除,例如 指标1:品牌、型号 指数2:品牌、型号、价格 我删除索引1 如果索引的顺序相同,但有额外的字段呢 指标1:品牌、型号 指标2:品牌、价格、型号 我是否可以安全地删除索引1 我的猜测是否定的,但我不确定好吧,当然你可以放弃它;你似乎有权限。然而,这些指数并不相等 例如,第一个将优化此查询: where brand = @brand and model = @model
- 指标1:品牌、型号
- 指数2:品牌、型号、价格
- 指标1:品牌、型号
- 指标2:品牌、价格、型号
where brand = @brand and model = @model
第二个将能够使用索引,但不是最佳的,因为它不能直接搜索到正确的行。引擎需要扫描索引中的所有@brand
记录,以找到匹配的车型。因为这可以在索引本身中完成,所以应该有相当好的性能
这对查询是否重要取决于查询的性质,但索引不是冗余的
顺便说一句,我认为MySQL在解释如何使用复合索引方面做得相当好(不同的数据库在索引使用方面并不完全相同,但它们非常相似)。不,删除它是不安全的。列的顺序和位置很重要 在其他两列(
品牌
和型号
)之间引入价格
列是问题所在。如果没有(品牌、型号)
上的索引,则型号
值在品牌
下是“有序”的。在model
之前添加price
列后,model
值不再“有序”
例如,执行此操作的查询:
WHERE brand = 'foo'
AND model >= 'bar' AND model <= 'cat'
WHERE brand='foo'
模型>='bar'和模型打败了我(正如我半预期的那样)。投了赞成票,解释得很好。