【问题标题】:Are these SQL indexes both necessary, or redundant: Over A only, and over A+B?这些 SQL 索引是必需的还是多余的:仅在 A 上,还是在 A+B 上?
【发布时间】:2017-06-26 19:00:02
【问题描述】:

我想创建 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")
        })

【问题讨论】:

  • 您使用的是哪个版本的 SQL?

标签: sql database-performance database-indexes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2012-04-06
      • 2011-02-03
      • 1970-01-01
      • 2020-04-13
      • 2013-07-02
      相关资源
      最近更新 更多