索引位于列的元组、有序集上,但索引的 UNIQUE 约束或限定条件位于(无序的)列集上。
我想到了 MySQL/MariaDB,但我的问题当然适用于其他 DBMS。
如果我有一个表 T,其中包含两列 id1、id2 和这两列的两个索引:
INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
我想向 DBMS 声明所有对(值(id1)、值(id2))或等价于所有对(值(id2)、值(id1))的表 T 的所有记录的多集, 是“UNIQUE”(这个多集是一个集),
我可以改变
INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
为了
UNIQUE INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
但我也可以声明:
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
是否有一些 DBMS 从
UNIQUE INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
那第二个索引也是唯一的?
是否有一些 DBMS 从
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
他们不必对表中的插入/更新值进行两次唯一性检查?
从声明的角度来看,我更喜欢
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
但是,插入/更新可能会降低性能。
如果在许多索引上声明 UNIQUE 会导致性能损失,它会很重要吗?
添加第二个 UNIQUE qualifiant 是否对某些查询有任何(显着的)性能提升?
案例 1 如果您需要同时避免 (1,2) 和 (2,1),那么问题中的任何内容都不会阻止这种形式的“dup”。
为此,请始终将
LESSER()
值存储在id1
和GREATER()
in 中id2
。然后UNIQUE(id1, id2)
防止重复。同时,在查找时对这两个值进行类似的排序。
那么您只有一把
UNIQUE
钥匙——也可能是PRIMARY KEY
. 现在你有ETC
情况 2 如果 (1,2) 和 (2,1) 可以共存,那么呈现给表的 id 的顺序很重要。可能你只需要
如果您有类似的东西
WHERE id1 BETWEEN .. AND .. AND id2 = 7
,那么您还需要我的食谱涵盖了大部分这些简单的可能性。
是的你应该。唯一数据的索引需要限定符
UNIQUE
,因为它决定了将使用哪种树结构。当然,您可以通过单一类型索引实现字段组合的唯一性,UNIQUE
但唯一索引本身在某种程度上比非唯一索引更快。如果索引可以是唯一的或非唯一的 - 使其唯一。