Eu posso imaginar como as linhas serão organizadas em uma única página de banco de dados como ordem de chave primária (por exemplo, uma chave de incremento automático) depois de ler este post . Mas eu me pergunto como será no caso de chaves primárias compostas. Por exemplo, considere a pk(a integer, b integer), se as linhas estão organizadas por coluna a ou por coluna b na página do banco de dados?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
(Esta resposta é focada no MySQL; em particular, o InnoDB Engine. O blog do JCole (ao qual você vinculou) é válido para o InnoDB, mas pode ser excessivamente técnico. Tentarei dar uma resposta mais leve.)
Pense em uma chave composta desta forma... Concatene as chaves juntas, então a estrutura BTree é como se tivesse uma chave de coluna única (embora maior).
A ordem das colunas especificadas em qualquer índice composto é importante. Para
PRIMARY KEY(a,b)
, as linhas estarão nesta ordem:Isso significa, por exemplo, que
WHERE a=2
encontrará todas as linhas "agrupadas" juntas. MasWHERE b=2
vai encontrá-los espalhados."Clustering" também é usado aqui para dizer que os dados estão bem ao lado do PK no mesmo BTree.
A estrutura do bloco (blocos de 16 KB no InnoDB) é controlada pelo que quer que aconteça. Ou seja, não há um lugar óbvio no par (a,b) onde um bloco termina e o próximo começa.
No InnoDB, o
PRIMARY KEY
é sempre agrupado com os dados. Como efeito colateral, há praticamente zero sobrecarga para essa KEY. Todas as "chaves secundárias" são BTrees separadas que possuem o PK em seus nós folha.No exemplo acima, digamos (para concisão) que havia apenas 3 linhas por bloco:
Observe que as quebras
a
não estão relacionadas às divisões de bloco. (Além disso, este exemplo pode ser enganoso -- Blocos raramente têm apenas 3 linhas; Blocos não têm necessariamente o mesmo número de linhas cada.)O MySQL não (que eu saiba) se desvia dos padrões aqui. Bem explicado na resposta a este post: https://stackoverflow.com/questions/1648217/what-does-ab-tree-index-on-more-than-1-column-look-like