MySQL : Clé primaire et index

  • Auteur de la discussion Auteur de la discussion Toma
  • Date de début Date de début
WRInaute discret
Bonsoir,

Voilà, j'ai un problème tout bête.
J'ai une table avec deux champ SMALLINT : id et id_perso.
À chaque id sera associé plusieurs id_perso et vice versa. Donc ni id, ni id_perso de sera unique.
Par contre je veux qu'un couple (id, id_perso) soit unique. J'ai donc déclaré le couple (id, id_perso) comme clé unique.

Ensuite, comme je vais principalement questionner cette table à partir de id, je me suis dit que ça serait une bonne idée de mettre id comme index. Et là patatras ! J'ai le warning suivant dans phpMyAdmin :

Code:
La colonne `id` ne devrait pas faire partie à la fois d'une clé unique et d'une clé index

D'ailleurs l'index sur id a "aucune" cardinalité, donc le warning semble être justifié.

Je ne comprends pas car a priori, le fait de déclarer un couple en clé unique ne crée pas un index, non ? Donc pourquoi je n'ai pas le droit de créer un index avec id ?
Étant donné que l'unicité du couple est primordiale, est-ce que la seule façon d'avoir un index sur id est de faire un index sur le couple (id, id_perso) et donc de déclarer (id, id_perso) comme clé primaire ? Je veux bien, mais je trouverais ça dommage de devoir créer un index sur deux champs alors que je n'en ai besoin que sur un seul.
 
WRInaute accro
Je ne sais pas comment ça se passe exactement avec mysql, mais avec postgresql, une clef unique (ou primaire, qui est forcément unique) implique la création automatique d'un index (c'est la seule façon efficace d'y arriver de toutes façons, sinon il faudrait parcourir l'ensemble de la table à chaque insertion ou modification pour vérifier que la contrainte est respectée). Et évidemment, s'il y a un index sur deux colonnes A et B, il peut être utilisé pour faire des recherches basées sur A uniquement (il sera éventuellement moins efficace comme index car plus gros, mais bon).

Jacques.
 
WRInaute occasionnel
Le fait de delcarer clé primaire fait automatiquement un index.
Quand un index est sur plusieurs champs, la façon mysql dont stock l'index (sous forme d'un arbre) te permet de faire des recherche aussi vite sur le 1er champs de l'index multiple.
Donc dans ton cas si ta clé primaire est id, id_perso, tu pourra c'est bon du as en quelque sorte déjà un index sur id.
En revanche ça ne marche pas pour id_perso (dans ce cas alors tu peux faire un index special sur id_perso)
 
Discussions similaires
Haut