如果unique
对字段进行约束,是否还需要在该字段上建立索引才能获得可伸缩的插入时间?或者这是为我完成的(即使它使用的索引不能公开访问?)
具体来说,我正在与Apache Derby一起进行原型设计,尽管我可能会在不久的将来将其移至MySQL。我也希望SQL标准中可能有一些说明。
我将永远不需要按此字段进行搜索,因此我宁愿不要创建无用的索引。但是我宁愿使用无用的索引也不愿使用O(n)
插入时间。
如果unique
对字段进行约束,是否还需要在该字段上建立索引才能获得可伸缩的插入时间?或者这是为我完成的(即使它使用的索引不能公开访问?)
具体来说,我正在与Apache Derby一起进行原型设计,尽管我可能会在不久的将来将其移至MySQL。我也希望SQL标准中可能有一些说明。
我将永远不需要按此字段进行搜索,因此我宁愿不要创建无用的索引。但是我宁愿使用无用的索引也不愿使用O(n)
插入时间。
Answers:
- 编辑 -
我的原始答案(在下面)可能对您完全没有用,因为它没有解决unique
约束问题。正如其他人所说,这些约束通常是通过隐式唯一索引来实现的。在特殊情况下,可能并非如此(例如,disable novalidate
对于Oracle)。
问题可能是:是否可以在没有索引的情况下强制执行唯一性?一般而言,答案并非是,尽管在某些情况下聚集索引将意味着索引和表是同一对象。
-结束编辑-
您说过:“我宁愿有一个无用的索引,而不要有O(n)的插入时间。”,但总的来说,数据库没有O(n)的插入时间。有两种情况需要考虑:
O(n)
您必须检查整个表。这就是我要避免的事情。
O(lg n)
插入时间。那不是问题。我的问题是系统,知道您需要该索引才能获得不错的插入时间,然后为我创建一个索引。
主键> =唯一> =索引==键
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,因为如果进行了有效的缓存。
UNIQUE
约束,该约束将创建索引而无需用户指定要创建的索引?
用黑体字回答问题:是的,使字段唯一会像主键一样对其进行索引。实际上,我已经在另一个问题中讨论了这个问题,该问题涉及具有自己名称的主键,以使其与其他唯一(候选)键区分开。
至于约束,将为您创建索引,以便建立约束范例。您应该能够删除重复的索引,甚至可以删除UNIQUE键,只要您创建的约束不引用您除约束范式之外亲自创建的其他UNIQUE键即可。
您可能永远不必搜索此字段,但是MySQL一定会以它为确定键的有效性并确定如何执行ON DELETE CASCADE和ON UPDATE CASCADE操作的路径。
UNIQUE索引仅保证表中每一行中元组(单行,成对,三元组,...,n元组等)的唯一性。
您可以自行决定删除此类重复索引,前提是您不破坏希望表具有的约束范式。
O(n)
)。如果有索引,查找将更快(可能是O(lg n)
)。那是我的问题。我非常了解参照完整性机制,我(出于此问题的目的)仅关注性能。