UNIQUE SQL 索引是否也用于加速搜索?

Are UNIQUE SQL indexes also used for speeding up searches?

假设 SQL 数据库 "values of series"。每个 Value 属于一个 Series,并且有一个日期:

@Entity
class Series { … }

Value {
   Series series;
   Date date;
   …
   }

每个系列和日期的组合的每个值都是唯一的,这是由该索引保证的:

UkSeries UNIQUE INDEX value (series ASC, data ASC)

在Hibernate中,上面的索引是通过这个注解创建的:

@Table (
    uniqueConstraints = @UniqueConstraint (columnNames = {"series", "data"}))

现在,请将它与这个可能的替代索引定义进行比较:

UkSeries UNIQUE INDEX value (series ASC, data ASC)
IdxSeries INDEX value (series ASC, data ASC)

@Table (
    uniqueConstraints = @UniqueConstraint (columnNames = {"series", "data"}),
    indexes = { @Index (name = "IdxSeries", columnList = "series, data") })

考虑到我也想加快在数据库中搜索值的速度,我的问题是:

单独使用"UNIQUE INDEX",除了保证唯一性,还能用来加快搜索速度吗?或者我真的需要两个索引,如我上面的替代索引定义中所示?

注意:我正在使用 MySQL,但我相信这个问题很简单,所以我的特定数据库并不重要。

This answer 解释说 MySQL 中的唯一约束(就像在大多数 RDBMS 中一样)只是一种特殊类型的索引,因此您不需要两者。唯一约束就可以了。

TL;DR:这取决于搜索的字段是否是索引的一部分。非唯一索引是完全多余的,实际上可能会减慢 inserts/updates/deletes.

一般来说,索引的主要目标是提高搜索性能。

为了在插入或更新期间遵守字段的唯一性约束,RDMS 需要检查 table 中是否不存在重复值。这意味着搜索。因此,很自然 UNIQUE 约束也是一个索引(以加速重复搜索),也可以用于搜索或至少限制其他查询的中间结果集。

除了加快搜索速度,索引也可能会减慢 inserts/updates/deletes。索引是已存储在 table 中的信息的副本,也需要保持最新。

除了对所含数据的自然限制进行建模外,还应根据应用程序的数据需求使用索引 - 以加快缓慢的搜索速度而不是减慢更新速度。

创建唯一索引可能会也可能不会加快搜索速度。这取决于搜索的字段是否是唯一索引的一部分(或通过附加约束与这些字段相关)。