O índice está em tuplas, conjuntos ordenados , de colunas, mas a restrição UNIQUE ou qualificante para um índice está em conjuntos (não ordenados) de colunas.
Eu tenho MySQL/MariaDB em mente, mas minhas perguntas certamente se aplicam a outros DBMS.
Se eu tiver uma tabela T com duas colunas id1, id2 e dois índices nestas duas colunas:
INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
e eu quero declarar ao DBMS que o multi-conjunto em todos os registros da tabela T de todos os casais (value(id1), value(id2)), ou equivalentemente todos os casais (value(id2), value(id1)) , é "ÚNICO" (este multi-conjunto é um conjunto),
eu posso mudar
INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
por
UNIQUE INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
Mas também posso declarar:
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
Existe algum SGBD que deduz
UNIQUE INDEX idx_id1_id2 (id1, id2)
INDEX idx_id2_id1 (id2, id1)
que o segundo índice também é único?
Existe algum SGBD que deduz
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
que eles não precisam fazer duas vezes a verificação de unicidade na inserção/atualização do valor na tabela?
Do ponto de vista declarativo, prefiro
UNIQUE INDEX idx_id1_id2 (id1, id2)
UNIQUE INDEX idx_id2_id1 (id2, id1)
mas, no entanto, pode haver uma penalidade de desempenho na inserção/atualização.
Se houver uma penalidade de desempenho por declarar UNIQUE em muitos índices, ela será significativa?
Existe algum aumento de desempenho (significativo) para algumas consultas com o segundo qualificador UNIQUE adicionado?
Caso 1 Se você precisar evitar tanto (1,2) quanto (2,1), então nada na pergunta impedirá essa forma de "dup".
Para fazer isso, sempre armazene o
LESSER()
valor emid1
e oGREATER()
emid2
. EntãoUNIQUE(id1, id2)
evita dups.Enquanto isso, faça um tipo semelhante dos dois valores ao fazer uma pesquisa.
Então você tem apenas uma
UNIQUE
chave - que também pode ser aPRIMARY KEY
. Agora você temetc
Caso 2 Se (1,2) e (2,1) podem coexistir, então a ordem dos ids apresentados na tabela é importante. Provavelmente tudo que você precisa é
Se você tiver algo como
WHERE id1 BETWEEN .. AND .. AND id2 = 7
, então você também precisariaMeu livro de receitas cobre a maioria dessas possibilidades simples.
Sim você deveria. O índice para dados únicos precisa de qualificador
UNIQUE
porque determina qual tipo de estrutura de árvore será usada. Claro que você pode alcançar a unicidade da combinação de campos por um único índice deUNIQUE
tipo, mas o índice exclusivo em si é de alguma forma mais rápido do que um não exclusivo. Se um índice puder ser exclusivo ou não exclusivo, torne-o exclusivo.