如果我对字段进行唯一约束,是否还需要在该字段上创建索引以获得可缩放的插入时间?或者这是为我完成的(即使它使用的索引不可公开访问?)
具体来说,我正在使用Apache Derby进行原型设计,尽管我可能会在半近期将其转移到MySQL.我也希望SQL标准中可能有一些内容可以说明这一点.
我永远不需要在这个领域进行搜索,所以我宁愿不做一个无用的索引.但我宁愿有一个无用的索引而不是O(n)插入时间.
解决方法:
– 编辑 –
我原来的答案(下面)可能对你没用,因为它没有解决唯一约束的问题.正如其他人所说,这些约束通常用隐含的唯一索引来实现.在特殊情况下,这可能不正确(例如,禁用Oracle的novalidate).
问题可能是:没有索引可以强制执行唯一性吗?一般来说答案是否定的,但在某些情况下,Clustered Index将意味着索引和表是同一个对象.
–END编辑 –
你说“我宁愿有一个无用的索引,而不是有一个O(n)插入时间.”,但一般数据库没有O(n)插入时间.有两种情况需要考虑:
>包含或不包含索引的普通表:
新行被转储到堆的顶部. RDBMS可能只查看1个块,因此不仅仅是O(1)而是非常小的O(1).
如果表具有索引,则将向每个索引添加指向该行的指针.这通常是O(log(n))操作.
>正在进行某种聚类的表,例如Oracle的Index Organized Table或cluster,或SQL Server和其他的Clustered Index:
新行被插入到特定块中,这可能导致块分裂或溢出,但无论发生什么,它仍然是O(log(n))或better,由用于查找块的b树或类似结构引起.