2009-12-22 7 views
2

Lorsque je lance la commande EXPLAIN sur ma requête MySQL:Base de données - Index sur plusieurs colonnes

EXPLAIN SELECT colZ FROM table1, table 2 
WHERE table1.colA = table2.colA 
AND table1.colB = table2.colB 
AND table1.colC = X 

Les états de commande EXPLAIN que les possible_keys comprennent:

colA, colB, colC 

Mais la clé réelle utilisée comme colA

Question: Cela implique-t-il que je devrais faire un index sur les trois colonnes combinées? Index (colA, colB, colC)?

+0

J'ai oublié d'ajouter, cette requête est la requête principale que je cours sur ma base de données et en tant que telle, elle doit fonctionner extrêmement rapidement. – Timk

Répondre

1

Oui, je vous recommande de créer l'index combiné

+0

Y a-t-il un point négatif à la création de l'index combiné? – Timk

+1

Seulement s'il n'est pas utilisé ... –

+0

Chaque index supplémentaire ajoute un peu de surcharge à insérer/supprimer. Les index sur les colonnes non-PK peuvent également ajouter un léger surcoût aux mises à jour. –

1

Si vous créez un index de couverture - à savoir celui qui assure le moteur de base de données peut récupérer toutes les informations nécessaires à partir de l'index seul - cela devrait faciliter la vie pour l'optimiseur. Dans votre cas, il faudrait couvrir les colonnes de la clause WHERE (un index sur colA, colB, colC dans table1, une autre sur colA, colB à table2).

mantaining cet index/index nécessite une certaine quantité de frais généraux, mais si les avantages l'emportaient sur l'entretien supplémentaire sera spécifique à votre configuration (par rapport à INSERTs SELECTs etc.etc.)

2

En regardant votre requête, vous obtiendrez des performances avec:

Index (IVC, ColB) sur table2

Index (IVC, ColB, colC, Colz) sur la table 1

Ces indices permettront une recherche d'index uniquement de Colz et devrait être v. fas t

0

La bonne réponse dépend de la sélectivité des différentes colonnes. En particulier, combien de valeurs différentes y a-t-il pour table1.col1C? S'il y a un total de deux valeurs (telles que 'M' et 'F' dans le tableau entier, il vaut mieux ne pas l'inclure dans l'index combiné.) Cependant, il y a environ un tiers de valeurs distinctes dans le tableau. col1C comme il y a des lignes dans table2, alors il est possible qu'un index sur juste table1.col1C donne des résultats très rapides

Si l'optimiseur peut trouver trois lignes dans table1 sans faire de jointures, puis faire une recherche trois Pour obtenir des connaissances sur le fonctionnement de l'optimiseur et une analyse approfondie de la population de données, il est probablement préférable d'essayer quelques alternatives et de lancer Repères

Voici la bonne nouvelle: vous pouvez toujours modifier la conception de l'index plus tard.

Questions connexes