这些 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 列上,另一个在 seriesdate 列上。使用 Hibernate 这将是:

@Table (indexes = {
        @Index (name = "idx1", columnList = "series"),
        @Index (name = "idx2", columnList = "series, date")
        })

我的问题是:如果我同时创建这两个索引,搜索速度是否更快,或者如果我只创建一个这样的索引,搜索速度是否相同:

@Table (indexes = {
        @Index (name = "idx", columnList = "series, date")
        })

您只需要一个包含两列的索引。

这两个索引是多余的,因为第二个索引包含与第一个相同的键,顺序相同(加上一个额外的键)。

总的来说,这是一个坏主意,因为它是不必要的冗余(有点双关语;)所以,只用两个键的索引。

在某些边缘情况下,两个这样的索引可能会有用。例如,如果您有大量数据或等效数据处于内存严重受限的环境中,那么第一个索引可能适合内存而第二个索引可能不适合。但是,那将是一种非常罕见的情况。而更好的解决方案是升级硬件。