A documentação do MySQL afirma que:
Quando você define uma PRIMARY KEY em sua tabela, o InnoDB a usa como o índice clusterizado.
Mas essa não é a única possibilidade, você pode agrupar um índice exclusivo:
Se você não definir uma PRIMARY KEY para sua tabela, o MySQL localiza o primeiro índice UNIQUE onde todas as colunas de chave são NOT NULL e o InnoDB o usa como o índice clusterizado.
Parece que se eu primeiro criar um índice exclusivo em uma tabela, ele será marcado como clusterizado; Posso então criar uma chave primária e ela não será agrupada:
CREATE TABLE Tmp_CUQTest
(
ID1 INT NOT NULL, -- Desired clustering field
ID2 INT NOT NULL -- Desired PK field
);
CREATE UNIQUE INDEX CUC_Tmp ON Tmp_CUQTest (ID1);
ALTER TABLE Tmp_CUQTest ADD CONSTRAINT PRIMARY KEY PK_Tmp (ID2);
No entanto, quando inspeciono a tabela resultante, minhas esperanças são frustradas:
Key Type Uni Columns
PRIMARY BTREE (clustered) YES ID2
ID1 BTREE YES ID1
Outra pergunta aqui no DBA.SE implica que criar um índice como parte do CREATE TABLE
script, e não depois, como uma CREATE INDEX
declaração separada, pode fazer a diferença. No entanto, recebo o mesmo resultado.
Existe uma maneira de forçar o MySQL a agrupar em um índice exclusivo de minha escolha, que não seja a chave primária, ou essa "opção de fallback" se aplica apenas a tabelas sem chave primária?
PRIMARY KEY
PRIMARY KEY
em cada tabela.PRIMARY KEY
é sempre agrupado; não pode haver nenhum outro índice "agrupado".UNIQUE
chave (com certas limitações) ou um número de sequência oculto (não exatamente o mesmo que `AUTO_INCREMENT; 6 bytes).UNIQUE
e é e index.Chaves secundárias
PRIMARY KEY
(ou seja, o 'índice clusterizado'). É assim que a chave secundária pode chegar à linha.UNIQUE KEY
é duas coisas: uma chave secundária (a menos que seja promovida a PK) e uma "restrição de exclusividade".Outras notas
CREATE TABLE
instrução ou fazCREATE INDEX
mais tarde. Idem para definirFOREIGN KEYs
.AUTO_INCREMENT
AUTO_INCREMENT
não precisa ser declaradoPRIMARY KEY
, ou mesmoUNIQUE
.Um truque . É possível fazer o seguinte. É isso que você está pescando??
Uma chave primária é uma chave exclusiva e um índice. Portanto, crie o PK como o índice exclusivo no qual você deseja agrupar.
Criar adicionando um índice posteriormente e como parte da tabela de criação produz o mesmo resultado.