Comment bien l'indice d'une table de liaison pour plusieurs-à-plusieurs connexion à MySQL?
Permet de dire que j'ai un simple plusieurs-à-plusieurs table entre les tables "table1" et "table2" qui se compose de deux int champs: "table1-id" et "table2-id". Comment dois-je l'index de cette table de liaison?
J'ai utilisé pour faire juste un composite index primaire (table1-id,table2-id), mais j'ai lu que cet indice peut ne pas fonctionner si vous changez l'ordre des champs dans la requête. Alors, quelle est la solution optimale puis - prendre des indices pour chaque domaine, sans un index primaire?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Il dépend de la façon dont vous recherchez.
Si vous recherchez comme ceci:
alors vous avez besoin:
Dans ce cas,
table1
sera à la tête dansNESTED LOOPS
et votre index sera utilisable que lorsquetable1
est indexé en premier.Si vous recherchez comme ceci:
alors vous avez besoin:
pour les raisons ci-dessus.
Vous n'avez pas besoin d'indices indépendants ici. Un indice composite peut être utilisé partout où un simple indice sur la première colonne peut être utilisée. Si vous utilisez des indices indépendants, vous ne serez pas en mesure de rechercher efficacement pour les deux valeurs:
Pour une requête de ce type, vous aurez besoin d'au moins un index sur les deux colonnes.
Il n'est jamais mauvais d'avoir un index supplémentaire pour le deuxième champ:
Clé primaire sera utilisé pour les recherches
on both values
et pour les recherches basées sur la valeur detable_1
, index supplémentaire sera utilisé pour les recherches basées sur la valeur detable_2
.CREATE INDEX ix_table2_table1 ON table_table (table_2, table_1)
plutôt queCREATE INDEX ix_table2 ON table_table (table_2)
?Aussi longtemps que vous spécifiez à la fois les clés de la requête, il n'a pas d'importance quel ordre ils ont dans la requête, ni n'importe quel ordre que vous spécifiez dans l'index.
Cependant, il n'est pas rare que vous serez parfois avoir un seul ou l'autre des touches. Si vous avez parfois l'id_1 seulement, alors que ce devrait être la première (mais vous avez encore besoin d'un seul index).
Si vous avez parfois l'un, parfois l'autre, parfois les deux, vous aurez besoin d'un index avec les deux touches, et un deuxième (non unique) de l'indice avec un champ - la plus sélective des deux touches et le principal indice composite devrait commencer avec l'autre clé.
@Quassnoi, dans votre première requête que vous êtes réellement en utilisant uniquement
tt.table_1
clé, comme nous pouvons le voir dans la clause where:WHERE t1.id = @id
. Et dans la deuxième requête uniquementtt.table_2
.De sorte que le multi-index de colonne ne peuvent être utiles que dans la troisième requête en raison de
WHERE table_1 = @id1 AND table_2 = @id2
. Si les requêtes de ce genre ne sont pas va être utilisé, pensez-vous que ça vaut la peine d'utiliser deux distinctes d'une colonne indices de la place?