2010-05-27 5 views
0

J'ai une table mysql de 3 champs entiers. Aucun des champs n'a une valeur unique - mais les trois combinés sont uniques.Indexer une table mysql de 3 champs entiers

Lorsque je interroge cette table, je recherche uniquement par le premier champ.

Quelle approche est recommandée pour l'indexation d'une telle table? Avoir une clé primaire à champs multiples sur les 3 champs, ou définir un index sur le premier champ, qui n'est pas unique?

Merci, Doori Bar

Répondre

2

deux. Vous aurez besoin de la clé primaire multi-champs pour assurer l'unicité, et vous aurez besoin de l'index sur le premier champ pour la vitesse pendant les recherches.

+0

Et si je n'ai pas besoin de 'garantir l'unicité', vous recommanderiez donc simplement d'avoir un index sur le premier champ, sans clé primaire? –

+0

Le point de «l'unicité» est de s'assurer que vous ne vous retrouvez pas avec deux lignes identiques. Ceci est une partie fondamentale de la conception de la base de données. – eykanal

0

Vous pouvez avoir un UNIQUE Constraint sur les trois champs combinés pour répondre à vos normes de qualité des données. Si vous effectuez une recherche principale sur Field1, vous devriez avoir un index dessus. Vous devez également considérer comment vous JOIN cette table. Vos index devraient vraiment supporter la plus grande charge de travail en premier - vous devrez regarder le plan d'exécution pour déterminer ce qui vous convient le mieux.

+0

si PK composite a d'abord Field1, un index sur ce champ est inutile. – dnagirl

0

La clé primaire empêchera votre application d'insérer accidentellement des lignes de dupe. Tu le veux probablement.

Ordonnez les colonnes dans le PK correctement si ou faites un index sur la première colonne groupée pour de meilleures performances. Comparez la façon dont la requête s'exécute (avec la PK présente) et avec et sans l'index sur la première colonne.

+0

Je ne comprends pas très bien pourquoi vous avez tous mentionné le concept d '«unicité» ... si la table fait partie du design de l'application, pourquoi devrais-je définir des «règles» qui empêchent passivement mon application de faire quelque chose? cela ne peut pas arriver par conception? Je ne peux vraiment pas saisir ce concept, à partir de mon POV - les données de la base de données et la validation étant régies par l'application, et non l'inverse –

0

Si vous utilisez InnoDB, vous devez disposer d'un index clusterisé. Si vous n'en spécifiez pas, MySQL en utilisera un en arrière-plan. Donc, vous pouvez aussi bien utiliser une clé primaire en cluster (unique) en combinant les trois colonnes.

La clé primaire empêchera également les doublons, ce qui est un bonus.

Si vous renvoyez tous les trois champs entiers, alors vous aurez un index couvert, ce qui signifie que la base de données n'aura même pas à toucher l'enregistrement réel. Il obtiendra tout ce dont il a besoin directement de l'index.

La seule mise en garde serait inserts (et annexes). La mise à jour d'un index clusterisé, en particulier sur plusieurs colonnes, comporte une pénalisation des performances. Ce sera à vous de tester et de déterminer la meilleure approche.

Questions connexes