IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Est-ce déconseillé d'ajouter un INDEX sur un champ UNIQUE ?


Sujet :

MySQL

  1. #1
    Membre à l'essai Avatar de ngmsky
    Homme Profil pro
    Inscrit en
    août 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2011
    Messages : 39
    Points : 20
    Points
    20
    Par défaut Est-ce déconseillé d'ajouter un INDEX sur un champ UNIQUE ?
    Bonjour,
    après plusieurs recherches, je ne trouve pas de sujets traitant de ma question. Voilà pourquoi j'ai décidé de la poser ici.


    phpMyAdmin signale qu'il y a deux index identiques, donc un index créé inutilement => pas bon. Et je ne comprends pas pourquoi ils seraient identiques.

    EXPLICATION :

    - J'ai créé une table (associative) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `livres_auteurs` (
     `idPersonne` smallint(5) unsigned NOT NULL,
     `code_isbn` char(13) NOT NULL COMMENT 'N° identifiant du livre',
     UNIQUE KEY `personne_livre_uniq` (`idPersonne`,`code_isbn`) COMMENT 'UNIQUE : personne - livre',
     KEY `code_isbn` (`code_isbn`),
     KEY `pers_livre_index` (`idPersonne`,`code_isbn`) COMMENT 'index personne - livre',
     CONSTRAINT `livres_auteurs_ibfk_1` FOREIGN KEY (`code_isbn`) REFERENCES `livres` (`code_isbn`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `livres_auteurs_ibfk_2` FOREIGN KEY (`idPersonne`) REFERENCES `tab_personnes` (`idPersonne`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    - NB : J'ai créé un index normal puis une contrainte UNIQUE sur le même groupe de champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    KEY `pers_livre_index` (`idPersonne`,`code_isbn`)
    UNIQUE KEY `personne_livre_uniq` (`idPersonne`,`code_isbn`)

    En visualisant la structure de la table et de ses index (en cliquant sur option, en bas) tout ce passe bien mais j'ai ce message d'alertes :

    "Les index personne_livre_uniq et pers_livre_index semblent identiques et l'un d'eux pourrait être supprimé. "

    - MES QUESTIONS :

    1/ Y a-t-il réellement duplication d'index ou contraintes ?
    2/ Si oui, devrais-je donc supprimer l'index (simple) ?
    3/ De façon générale, pour mieux comprendre, si cette alerte est juste, cela voudrait dire que lorsqu'on place une contrainte UNIQUE sur un champ (ou combinaison de champs), il devient inutile d'y ajouter un index ?

    En fait, je croyais avoir lu quelque part que pour optimiser une base de données, lorsqu'on place une contrainte UNIQUE, il fallait impérativement y ajouter un INDEX, sinon lors des insert ou des update, le SGBD serait obligé de scanner toutes les lignes de la table pour vérifier s'il n'y a pas déjà un champ avec une valeur identique à celle qu'on veut ajouter ou mettre à jour. Or s'il y avait un INDEX sur ce champ, la vérification serait largement accélérée.

    Je peux bien enlever l'index et ne laisser que la contrainte UNIQUE (s'il le faut) mais je me demande si cela ne causerait pas de problèmes de performances.


    4/ Dernière question : La règle à tenir (UNIQUE seul) ou (UNIQUE + INDEX) ? Est-elle propre à mysql ou valable aussi pour tout autre SGBD ?

    Merci d'avance à tous.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 643
    Points : 13 070
    Points
    13 070
    Par défaut
    Citation Envoyé par ngmsky Voir le message
    En fait, je croyais avoir lu quelque part que pour optimiser une base de données, lorsqu'on place une contrainte UNIQUE, il fallait impérativement y ajouter un INDEX, sinon ...
    C'est vrai ! C'est même tellement vrai, que les SGBD posent automatiquement un index lorsque vous déclarez une contrainte d'unicité afin de supporter celle-ci.
    Ceci explique pourquoi votre index pers_livre_index est effectivement de trop - car redondant avec personne_livre_uniq - et vous pouvez le supprimer.

  3. #3
    Membre à l'essai Avatar de ngmsky
    Homme Profil pro
    Inscrit en
    août 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2011
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Bonsoir et merci pour votre réponse.
    Bon, là maintenant je peux continuer la création de mes tables sans trop hésiter sur cette question d'index.

    Je retiens donc que la contrainte UNIQUE suffit.
    Mais est-ce aussi vrai pour les autres SGBD comme postgres, oracle, sql server, sqlite ?

    De plus, j'ai supprimé mon index simple mais l'index créé automatiquement par MySql n'apparait pas dans la liste des index (dans phpMyAdmin) ?
    Puisque s'il y a doublon, il y a donc bien un index quelque part. mais où ?

    Merci encore. À bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Ajout d'index sur les tables systèmes de la réplication
    Par gaultier dans le forum Administration
    Réponses: 3
    Dernier message: 04/11/2014, 19h40
  2. [2008] Ajouter un index sur une table système
    Par Baquardie dans le forum Administration
    Réponses: 2
    Dernier message: 04/02/2014, 19h04
  3. Ajout d'indexes sur table existante
    Par frenchsting dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/11/2009, 12h09
  4. n INDEXs sur chaque champ ou 1 seul INDEX sur n ch
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/04/2004, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo