这些 SQL 索引是必要的还是多余的:仅在 A 上,以及在 A+B 上?
Are these SQL indexes both necessary, or redundant: Over A only, and over A+B?
我想创建 SQL 索引来加快速度,例如,在数据库中搜索 "values of series"。每个 Value
属于一个 Series
,并且有一个日期:
@Entity
class Series { … }
Value {
Series series;
Date date;
…
}
有数百个系列,每个系列都有数千个值。
我经常执行两种类型的搜索:
1) 搜索属于某个系列的所有值(不管它们的日期)。
2) 搜索属于某个系列且在某个特定日期间隔内的所有值。
我可以创建两个 SQL 索引,一个仅在 series
列上,另一个在 series
和 date
列上。使用 Hibernate 这将是:
@Table (indexes = {
@Index (name = "idx1", columnList = "series"),
@Index (name = "idx2", columnList = "series, date")
})
我的问题是:如果我同时创建这两个索引,搜索速度是否更快,或者如果我只创建一个这样的索引,搜索速度是否相同:
@Table (indexes = {
@Index (name = "idx", columnList = "series, date")
})
您只需要一个包含两列的索引。
这两个索引是多余的,因为第二个索引包含与第一个相同的键,顺序相同(加上一个额外的键)。
总的来说,这是一个坏主意,因为它是不必要的冗余(有点双关语;)所以,只用两个键的索引。
在某些边缘情况下,两个这样的索引可能会有用。例如,如果您有大量数据或等效数据处于内存严重受限的环境中,那么第一个索引可能适合内存而第二个索引可能不适合。但是,那将是一种非常罕见的情况。而更好的解决方案是升级硬件。
我想创建 SQL 索引来加快速度,例如,在数据库中搜索 "values of series"。每个 Value
属于一个 Series
,并且有一个日期:
@Entity
class Series { … }
Value {
Series series;
Date date;
…
}
有数百个系列,每个系列都有数千个值。
我经常执行两种类型的搜索:
1) 搜索属于某个系列的所有值(不管它们的日期)。
2) 搜索属于某个系列且在某个特定日期间隔内的所有值。
我可以创建两个 SQL 索引,一个仅在 series
列上,另一个在 series
和 date
列上。使用 Hibernate 这将是:
@Table (indexes = {
@Index (name = "idx1", columnList = "series"),
@Index (name = "idx2", columnList = "series, date")
})
我的问题是:如果我同时创建这两个索引,搜索速度是否更快,或者如果我只创建一个这样的索引,搜索速度是否相同:
@Table (indexes = {
@Index (name = "idx", columnList = "series, date")
})
您只需要一个包含两列的索引。
这两个索引是多余的,因为第二个索引包含与第一个相同的键,顺序相同(加上一个额外的键)。
总的来说,这是一个坏主意,因为它是不必要的冗余(有点双关语;)所以,只用两个键的索引。
在某些边缘情况下,两个这样的索引可能会有用。例如,如果您有大量数据或等效数据处于内存严重受限的环境中,那么第一个索引可能适合内存而第二个索引可能不适合。但是,那将是一种非常罕见的情况。而更好的解决方案是升级硬件。