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 中的信息的副本,也需要保持最新。
除了对所含数据的自然限制进行建模外,还应根据应用程序的数据需求使用索引 - 以加快缓慢的搜索速度而不是减慢更新速度。
创建唯一索引可能会也可能不会加快搜索速度。这取决于搜索的字段是否是唯一索引的一部分(或通过附加约束与这些字段相关)。
假设 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 中的信息的副本,也需要保持最新。
除了对所含数据的自然限制进行建模外,还应根据应用程序的数据需求使用索引 - 以加快缓慢的搜索速度而不是减慢更新速度。
创建唯一索引可能会也可能不会加快搜索速度。这取决于搜索的字段是否是唯一索引的一部分(或通过附加约束与这些字段相关)。