使字段唯一会使索引吗?


10

如果unique对字段进行约束,是否还需要在该字段上建立索引才能获得可伸缩的插入时间?或者这是为我完成的(即使它使用的索引不能公开访问?)

具体来说,我正在与Apache Derby一起进行原型设计,尽管我可能会在不久的将来将其移至MySQL。我也希望SQL标准中可能有一些说明。

我将永远不需要按此字段进行搜索,因此我宁愿不要创建无用的索引。但是我宁愿使用无用的索引也不愿使用O(n)插入时间。


2
据我所知,唯一约束是在使用唯一索引之后实现的。您可以在以下问题中看到关于这种情况的一些意见:何时使用唯一约束而不是唯一索引?
玛丽安

@Marian感谢您的链接。非常有见地。
corsiKa 2011年

Answers:


2

- 编辑 -

我的原始答案(在下面)可能对您完全没有用,因为它没有解决unique约束问题。正如其他人所说,这些约束通常是通过隐式唯一索引来实现的。在特殊情况下,可能并非如此(例如,disable novalidate对于Oracle)。

问题可能是:是否可以在没有索引的情况下强制执行唯一性?一般而言,答案并非是,尽管在某些情况下聚集索引将意味着索引和表是同一对象。

-结束编辑-

您说过:“我宁愿有一个无用的索引,而不要有O(n)的插入时间。”,但总的来说,数据库没有O(n)的插入时间。有两种情况需要考虑:

  1. 带有或不带有索引的普通表:

    新行将转储到堆的顶部。RDBMS可能只看1个块,所以不仅是O(1),而且是很小的O(1)。

    如果表中有索引,则将向该行添加一个指向行的指针。这通常是O(log(n))操作。

  2. 带有某种集群的,例如针对Oracle 的索引组织表集群,或针对SQL Server 的集群索引等:

    将新行插入到特定的块中,这可能会导致该块分裂或溢出,但是无论什么情况仍然是O(log(n))或更好,这是由用于查找该块的b树或类似结构引起的。


但是没有索引的唯一性将是O(n)您必须检查整个表。这就是我要避免的事情。
corsiKa 2011年

这确实是这个问题的最佳答案!+1
RolandoMySQLDBA 2011年

@Trick-是的,我一开始误会了。索引是您担心唯一性约束所要付出的代价。您是否可以使用集群索引?
杰克说请尝试topanswers.xyz 2011年

1
@JackPDougless我可以使用标准的“索引”并获得O(lg n)插入时间。那不是问题。我的问题是系统,知道您需要该索引才能获得不错的插入时间,然后为我创建一个索引。
corsiKa 2011年

2

主键> =唯一> =索引==键

InnoDB数据由PK排序。MyISAM PK的行为与UNIQUE相同。

INSERT必须为您拥有的每个索引(任何类型)添加一个“行”。这需要一些时间。(通常没有足够的时间处理。)索引全部以BTree格式存储。MyISAM BTree块为1KB;InnoDB使用16KB。

插入InnoDB会同时更新PK和数据。

插入MyISAM通常会将数据“附加”到.MYD。单独地,它向PK添加一行(如果有)。

INSERT必须首先验证任何PRIMARY或UNIQUE密钥都没有重复的密钥。这是通过使用索引来完成的。因此,为什么唯一键和外键约束真正建立索引。这是O(logN),但通常是CPU,而不是I / O,因为如果进行了有效的缓存。


在InnoDB规范中您是否引用了UNIQUE约束,该约束将创建索引而无需用户指定要创建的索引?
corsiKa 2011年

嗯...不,只有几年的经验。
瑞克·詹姆斯

这是一种测试它的方法...创建一个没有任何二级索引的表;执行SHOW TABLE STATUS-Index_length将为0。现在,表状态将显示一些内容。(可能必须在表中放入大量数据。)
瑞克·詹姆斯

1

用黑体字回答问题:是的,使字段唯一会像主键一样对其进行索引。实际上,我已经在另一个问题中讨论了这个问题,该问题涉及具有自己名称的主键,以使其与其他唯一(候选)键区分开

至于约束,将为您创建索引,以便建立约束范例。您应该能够删除重复的索引,甚至可以删除UNIQUE键,只要您创建的约束不引用您除约束范式之外亲自创建的其他UNIQUE键即可。

您可能永远不必搜索此字段,但是MySQL一定会以它为确定键的有效性并确定如何执行ON DELETE CASCADE和ON UPDATE CASCADE操作的路径。

UNIQUE索引仅保证表中每一行中元组(单行,成对,三元组,...,n元组等)的唯一性。

您可以自行决定删除此类重复索引,前提是您不破坏希望表具有的约束范式。


1
这没有回答我的问题。我的问题与插入时间有关。如果您有唯一约束,则系统必须在插入之前确保该字段的唯一性-如果该字段上没有索引,则它必须搜索整个表(O(n))。如果有索引,查找将更快(可能是O(lg n))。那是我的问题。我非常了解参照完整性机制,我(出于此问题的目的)仅关注性能。
corsiKa 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.