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

时间:2017-06-26 19:50:40

标签: mysql sql database-performance database-indexes

假设SQL数据库为"系列"的值。每个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,但我相信这个问题很简单,所以我的特定数据库并不重要。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

TL; DR:这取决于搜索的字段是否是索引的一部分。非唯一索引是完全冗余的,实际上可能会减慢插入/更新/删除的速度。

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

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

除了加快搜索速度之外,索引还可能减慢插入/更新/删除速度。索引是已存储在表中的信息的副本,也需要是最新的。

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

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