这些SQL索引是必要的还是冗余的:只有A,而且超过A + B?

时间:2017-06-26 19:00:03

标签: sql database-performance database-indexes

我想创建SQL索引以加快速度,例如,在数据库中搜索“系列值”。每个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")
        })

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这两个索引是冗余的,因为第二个索引包含与第一个索引相同的密钥,顺序相同(加上一个附加密钥)。

一般来说,这是一个坏主意,因为它是不必要的冗余(在那里是一种双关语;)所以,只需要使用两个键的索引。

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