Eu sei que a ordem das colunas em um índice composto é importante se você quiser consultar por um subconjunto das colunas indexadas, mas se sua consulta especificar valores para todas as colunas indexadas, há algum benefício de desempenho em ter uma coluna de alta cardinalidade antes de uma coluna de baixa cardinalidade? Lembro-me vagamente de ler algo que sugeria que era esse o caso, porque reduz o conjunto de resultados mais rapidamente, mas não consigo encontrar nada para apoiar isso agora.
Estou usando MySQL com InnoDB. O InnoDB usa índices clusterizados, o que pode ser relevante para minha pergunta, mas acho que só faz isso para chaves primárias, o que meu índice não é. A tabela fica mais ou menos assim:
CREATE TABLE `my_table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ref_a_id` int(10) unsigned NOT NULL,
`ref_b_id` int(10) unsigned NOT NULL,
`is_active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `index_my_table_on_ref_a_ref_b_is_active` (`ref_a_id`, `ref_b_id`, `is_active`)
) ENGINE=InnoDB AUTO_INCREMENT=2818259 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Em relação à minha pergunta, imagine ref_a_id
tem uma cardinalidade maior que ref_b_id
.
É um conto da carochinha que a cardinalidade importa.
INDEX(a,b)
eINDEX(b,a)
executam virtualmente de forma idêntica quando em um BTree. A profundidade do BTree é a mesma.O que importa é que ambas as colunas são pesquisadas com
=
, como emWHERE a=12 AND b=45
.O
PRIMARY KEY
no InnoDB é um BTree, assim como cada índice secundário. A única diferença é o que mais está nos nós folha. Os nós folha do PK contém todas as colunas; os nós de folha de um índice secundário contém as colunas do PK.No InnoDB (não em alguns produtos concorrentes), o PK é, por definição, clusterizado e
UNIQUE
.Quanto à sua mesa,...
Você está permitindo linhas para cada combinação ref_a--ref_b? Um 'ativo', outro não? Isso parece improvável.
Por que ter
id
? Por que não promover aUNIQUE
chave para ser o PK?is_active
Alguma vez éNULL
?Veja minhas dicas em muitas: muitas tabelas de mapeamento .