SQL 索引 - 这是重叠的吗?
SQL Index - is this overlapping?
我正在查看并删除 SQL 数据库中的重复和冗余索引。
因此,如果我有两个相同的索引,我会删除。
如果我有重叠的索引,我会删除,例如...
- 索引1:品牌、型号
- 索引2:品牌、型号、价格
我删除了索引 1。
相同顺序但有额外字段的索引呢?
- 索引1:品牌、型号
- 索引2:品牌、价格、型号
我能否安全地删除索引 1?
我猜不是,但我不确定
好吧,你当然可以放弃它;你似乎有权限。但是,索引并不相同。
例如,第一个将优化此查询:
where brand = @brand and model = @model
第二个将能够使用索引,但不是最优的,因为它不能直接查找到正确的行。引擎需要扫描索引中的所有 @brand
记录以找到匹配的模型。因为这可以在索引本身中完成,所以应该有很好的性能。
这对您的查询是否重要取决于查询的性质,但索引不是多余的。
顺便说一句,我认为 MySQL documentation 很好地解释了如何使用复合索引(不同的数据库在索引使用上并不完全相同,但它们相当相似)。
不,删除它是不安全的。列的顺序和位置很重要。
在其他两列(brand
和 model
)之间引入 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" 用于强制唯一性的索引,删除这些索引是不安全的,除非存在具有不同顺序的相同列的等效索引。
我正在查看并删除 SQL 数据库中的重复和冗余索引。
因此,如果我有两个相同的索引,我会删除。
如果我有重叠的索引,我会删除,例如...
- 索引1:品牌、型号
- 索引2:品牌、型号、价格
我删除了索引 1。
相同顺序但有额外字段的索引呢?
- 索引1:品牌、型号
- 索引2:品牌、价格、型号
我能否安全地删除索引 1?
我猜不是,但我不确定
好吧,你当然可以放弃它;你似乎有权限。但是,索引并不相同。
例如,第一个将优化此查询:
where brand = @brand and model = @model
第二个将能够使用索引,但不是最优的,因为它不能直接查找到正确的行。引擎需要扫描索引中的所有 @brand
记录以找到匹配的模型。因为这可以在索引本身中完成,所以应该有很好的性能。
这对您的查询是否重要取决于查询的性质,但索引不是多余的。
顺便说一句,我认为 MySQL documentation 很好地解释了如何使用复合索引(不同的数据库在索引使用上并不完全相同,但它们相当相似)。
不,删除它是不安全的。列的顺序和位置很重要。
在其他两列(brand
和 model
)之间引入 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" 用于强制唯一性的索引,删除这些索引是不安全的,除非存在具有不同顺序的相同列的等效索引。