Mysql

我應該對類似的多索引重複 UNIQUE 約束嗎?

  • March 11, 2018

索引位於列的元組、有序集合上,但索引的唯一約束或限定條件位於*(無序的)*列集合上。

我想到了 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()值儲存在 inid1GREATER()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)

我的食譜涵蓋了大多數這些簡單的可能性。

引用自:https://dba.stackexchange.com/questions/199539