2011-01-23 5 views
14

J'essaie de comprendre ce qui est mieux lors de la définition des index multi-colonnes: (cardinalité plus, pour la vitesse)Ordre des colonnes dans un index à plusieurs colonnes MySQL

  • Putting la colonne la plus sélective premier ; ou
  • Mettre la colonne moins sélective première (Basse cardinalité, pour la compression d'index?)

Ou peut-être cela dépend si je l'optimisation de la vitesse ou de l'espace?

+0

Votre ordre d'index est défini par les requêtes que l'index est censé traiter. Une fois que vous avez défini les index par les requêtes, vous n'avez PAS le choix dans l'ordre dans lequel elles apparaissent sans rendre l'index inutilisable pour certaines requêtes. –

+0

Encore une fois, je comprends cela, mais entre les deux options qui servent les requêtes - ce qui est mieux, en prenant la grande différence dans la cardinalité? – sbargay

+1

@sbargay Avez-vous déjà trouvé la réponse à cette question? Je sais ce que vous demandez. Si vous avez country_id et person_id, vaut-il mieux configurer l'index country_id, person_id, ou vaut-il mieux définir la cardinalité supérieure en premier avec person_id, country_id. Il semble que vous sachiez comment utiliser correctement les index dans vos requêtes, mais j'avais la même question que vous. – n0nag0n

Répondre

3

Toujours mettre la colonne la plus sélective au début, il y a très rarement une raison pour l'inverse.

ou peut-être cela dépend si j'optimise pour la vitesse ou l'espace?

Laissez-moi le dire de cette façon. Quel est le point d'utiliser moins de stockage, si elle provoque l'index not to be used at all? Un index de cardinalité faible (entrant dans l'ordre des colonnes) ne sera normalement pas utilisé s'il ne s'agit pas d'un index de couverture pour la requête, car il reviendra très cher de revenir aux données des autres colonnes.

Le point des index est d'aider la requête et de les avoir dans le bon ordre (cardinalité) devrait toujours être le premier et le plus important.

+2

Ok - disons que je sauvegarde l'identifiant du pays (cardinalité faible) et l'identifiant de la personne (cardinalité élevée). La même personne peut exister dans plusieurs pays. Dois-je mettre country_id, person_id ou vice versa? J'ai parfois besoin de récupérer toutes les personnes d'un pays, et parfois atteindre toutes les personnes avec le même person_id – sbargay

9

L'ordre des colonnes doit correspondre à l'ordre dans lequel les colonnes sont interrogées plus tard ou MySQL ne les utilisera pas. C'est la question à laquelle vous devriez vraiment penser.

En savoir plus here.

MISE À JOUR:

Pour votre question sur cardinalité lire this peut-être. Est-ce que c'est similaire à votre question? Est-ce que ça répond?

+0

Je prends soin de la séquence (le plus à gauche peut être utilisé pour les requêtes sur une seule colonne, etc.), mais j'ai encore la qui est le premier et qui est le deuxième. Je cherche un indice pour choisir qui va où. – sbargay

+0

Avez-vous lu le lien? Soit je ne comprends pas la question ou la réponse est donnée et est "dans l'ordre où ils sont généralement interrogés". – FabianB

+0

Oui, je l'ai lu: par ex. index sur colonnes a = cardinalité = 23, b = cardinalité = 1000000, c = cardinalité = 500000. Mes requêtes ont toujours besoin de la colonne a, b ou a, b, c. – sbargay

Questions connexes