假设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,但我相信这个问题很简单,所以我的特定数据库并不重要。
答案 0 :(得分:4)
This answer解释了MySQL中的唯一约束(就像在大多数RDBMS中一样)只是一种特殊类型的索引,因此您不需要两者。唯一约束就可以了。
答案 1 :(得分:1)
TL; DR:这取决于搜索的字段是否是索引的一部分。非唯一索引是完全冗余的,实际上可能会减慢插入/更新/删除的速度。
一般来说,索引的主要目标是提高搜索性能。
为了在插入或更新期间遵守字段上的唯一性约束,RDMS需要检查表中是否已存在重复值。这意味着搜索。因此,UNIQUE约束也是一个索引(加速重复搜索)是很自然的,也可以用于搜索或至少限制其他查询的中间结果集。
除了加快搜索速度之外,索引还可能减慢插入/更新/删除速度。索引是已存储在表中的信息的副本,也需要是最新的。
除了对所包含数据的自然限制进行建模之外,还应根据应用程序的数据需求使用索引 - 加快搜索速度,而不是降低更新速度。
创建唯一索引可能会也可能不会加快搜索速度。这取决于搜索的字段是唯一索引的一部分(或通过附加约束与这些字段相关)。