【问题标题】:Are UNIQUE SQL indexes also used for speeding up searches?UNIQUE SQL 索引是否也用于加速搜索?
【发布时间】:2017-06-26 19:50:39
【问题描述】:

假设有一个“系列值”的 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,但我相信这个问题很简单,因此我的特定数据库无关紧要。

【问题讨论】:

  • 我没有任何特定的 MySQL 知识,但一般来说,那里的第二个索引将是完全多余的。
  • 好问题。我很确定答案是您只需要唯一索引,但我不知道 mysql 文档,所以我会让其他人回答。

标签: mysql sql database-performance database-indexes


【解决方案1】:

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

【讨论】:

  • 要获得支持这一点的经验证据,请尝试以下实验:仅在表中创建唯一约束,然后在另一个表中引用唯一约束中的字段作为外键(与相同的字段命令)。由于这是允许的——而且它不会创建新的索引——这是一个非常有力的证据,一个唯一的约束也是一个索引。
  • 我知道唯一约束是索引,但我不确定它是否是某种阻止它用于常规搜索的索引。而且,至少在 MySQL 中,我的替代索引定义是创建两个索引,一个标记为 UNIQUE,另一个不标记,所以如果有什么的话,这将证明它们不一样。这就是为什么我不得不问这个问题。但是,如果我这样做 @Index (columnList = "series, date", unique = true) 它实际上会创建一个标有 UNIQUE 的索引,该索引似乎与唯一约束相同。所以我猜它们是一样的,但 MySQL 根本不检查冗余。
  • @MarcG:您最初的问题是,是否可以将唯一约束用作索引以加快搜索速度,而不是这两种类型的索引是否 100% 相同——显然它们不是。在我的回答中,我既没有说也没有暗示它们是相同的——我说唯一约束是一种索引,它们是(并且回答了你实际提出的问题)。如果您现在声称要询问它们是否相同,请相应地更新问题。但是,我不知道您为什么会问这个问题,因为您还说很明显它们并不相同。
  • 我知道两者都是索引。我知道它们并不相同。我只是想确定唯一键是一种“特殊类型的索引”,可用于加快查询搜索。
  • 那么我的第一条评论仍然适用。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2014-11-12
    • 1970-01-01
    • 2023-01-05
    • 2019-08-14
    • 2011-02-21
    • 1970-01-01
    • 2012-05-15
    • 2010-10-31
    相关资源
    最近更新 更多