Mysql
我應該對類似的多索引重複 UNIQUE 約束嗎?
索引位於列的元組、有序集合上,但索引的唯一約束或限定條件位於*(無序的)*列集合上。
我想到了 MySQL/MariaDB,但我的問題當然適用於其他 DBMS。
如果我有一個表 T 有兩列 id1、id2 和這兩列上的兩個索引:
INDEX idx_id1_id2 (id1, id2) INDEX idx_id2_id1 (id2, id1)
並且我想向 DBMS 聲明所有對 (value(id1), value(id2)) 或等效所有對 (value(id2), value(id1)) 的表 T 的所有記錄上的多重集, 是“唯一的”(這個多集是一個集),
我能改變
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 限定符後,某些查詢是否有任何(顯著)性能提升?
案例 1 如果您需要同時避免 (1,2) 和 (2,1),那麼問題中的任何內容都不會阻止這種形式的“dup”。
為此,請始終將
LESSER()
值儲存在 inid1
和GREATER()
in 中id2
。然后UNIQUE(id1, id2)
防止重複。同時,在進行查找時對這兩個值進行類似的排序。
那麼你只有一把
UNIQUE
鑰匙——也可能是PRIMARY KEY
. 現在你有
- 唯一性約束有效
- 更少的索引
- 只需要查找一次,不需要兩次
等等
情況 2 如果 (1,2) 和 (2,1) 可以共存,那麼呈現給 table 的 id 的順序很重要。可能你所需要的只是
PRIMARY KEY(id1, id2)
如果你有類似的東西
WHERE id1 BETWEEN .. AND .. AND id2 = 7
,那麼你還需要INDEX(id2, id1)
我的食譜涵蓋了大多數這些簡單的可能性。