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

Requêtes MySQL Discussion :

y-a-t-il une utilité à mettre plusieurs indexes sur le même champ dans une table ?


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut y-a-t-il une utilité à mettre plusieurs indexes sur le même champ dans une table ?
    bonjour,

    Je suis en train de reprendre une base de données créée par une ancienne personne plus présente, c'est un projet repris par de multiples personnes dont je n'ai pas de doc.

    Dans plusieurs table, je m'aperçois qu'il y a plusieurs index sur les mêmes champs.
    Quelle est l'utilité ?

    Au départ je pensais à une erreur mais j'en suis pas sûr car si Mysql laisse faire cela, c'est qu'il doit y en avoir raison, mais laquelle ?

    En plus phpmy admin affiche le ptit message avec le triangle rouge :
    Les index code_flaveur_couleur et code_gout_3 semblent identiques et l'un d'eux pourrait être supprimé.
    une idée ?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 040
    Points
    34 040
    Billets dans le blog
    14
    Par défaut
    Si les deux index sont identiques c'est qu'il y en a un de trop !

    Le cas qui a pu se présenter, c'est quand il y a des tables associatives avec des clés étrangères et qu'en plus de créer l'index sur la clé primaire multi-colonne, un index ait été créé aussi sur chaque colonne de la clé primaire or la première colonne est déjà indexée par l'index multi-colonne.

    Exemple...

    Un petit MCD pour commencer :
    Personne -0,n----Participer----0,n- Réunion

    Tables qui en découlent :
    personne (p_id, p_nom, p_prenom...)
    reunion (r_id, r_date_heure, r_objet...)
    participer (par_id_personne, par_id_reunion)

    La table participer est une table associative dont la clé primaire est composée des identifiants des deux entités entrant en jeu dans l'association.
    Comme toute clé primaire, il y aura un index sur le couple (par_id_personne, par_id_reunion). Par cet index, la colonne par_id_personne est déjà indexée. Par contre, il est pertinent d'ajouter un index sur la colonne par_id_reunion.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut ok
    merci de ta réponse, mais dans mon cas la table est plus bateau que cela encore, c'est pour cela que je m'interroge :

    DROP TABLE IF EXISTS `produit`;
    CREATE TABLE IF NOT EXISTS `produit` (
    `code_article` varchar(15) NOT NULL DEFAULT '',
    `code_produit` varchar(30) NOT NULL DEFAULT '',
    `langue` char(3) NOT NULL DEFAULT '',
    `denomination_vente1` varchar(200) NOT NULL DEFAULT '',
    `denomination_vente2` varchar(200) NOT NULL DEFAULT '',
    PRIMARY KEY (`code_produit`),
    KEY `code_produit` (`code_produit`),
    KEY `code_article` (`code_article`),
    KEY `code_article_2` (`code_article`),
    KEY `code_article_3` (`code_article`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    utilité de code_article_2 et code_article_3 ?

    comme je reprends le travail de quelqu'un je ne sais pas si c'est utile, une bidouille, un bug, une erreur ou pas...

  4. #4
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 414
    Points : 871
    Points
    871
    Par défaut ok
    ici, on parle d'un cas similaire, mais c'est pas explicite :
    http://jira.atlassian.com/browse/CONF-1204



    For some reason, Confluence indexes all DB indexes multiple times. This has several adverse effects:

    1) The DB operates slower since it has to update multiple indexes instead of just one
    2) The DB size requirements are significantly higher than with just one index

    Example of one MySQL create statement from Confluence:

    DROP TABLE IF EXISTS `SPACES`;
    CREATE TABLE `SPACES` (
    `SPACEID` bigint(20) NOT NULL default '0',
    `SPACENAME` varchar(255) default NULL,
    `SPACEKEY` varchar(255) NOT NULL default '',
    `SPACEDESCID` bigint(20) default NULL,
    `HOMEPAGE` bigint(20) default NULL,
    `CREATOR` varchar(255) default NULL,
    `CREATIONDATE` datetime default NULL,
    `LASTMODIFIER` varchar(255) default NULL,
    `LASTMODDATE` datetime default NULL,
    PRIMARY KEY (`SPACEID`),
    UNIQUE KEY `SPACEKEY` (`SPACEKEY`),
    KEY `HOMEPAGE` (`HOMEPAGE`),
    KEY `SPACEDESCID` (`SPACEDESCID`),
    KEY `HOMEPAGE_2` (`HOMEPAGE`),
    KEY `SPACEDESCID_2` (`SPACEDESCID`),
    KEY `HOMEPAGE_3` (`HOMEPAGE`),
    KEY `SPACEDESCID_3` (`SPACEDESCID`),
    KEY `HOMEPAGE_4` (`HOMEPAGE`),
    KEY `SPACEDESCID_4` (`SPACEDESCID`),
    KEY `HOMEPAGE_5` (`HOMEPAGE`),
    KEY `SPACEDESCID_5` (`SPACEDESCID`),
    KEY `HOMEPAGE_6` (`HOMEPAGE`),
    KEY `SPACEDESCID_6` (`SPACEDESCID`)
    ) TYPE=MyISAM;

    where the HOMEPAGE and SPACEDESCID columns are indexed seven times for no reason.

    The fix is to remove the duplicates from the indexes.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 040
    Points
    34 040
    Billets dans le blog
    14
    Par défaut
    Beurk !
    - Une clé primaire sur une colonne de type VARCHAR(30) ==> Pas optimum !
    - La clé sur code_produit alors que c'est déjà la clé primaire ==> Inutile !
    - 3 clés sur code_article ==> Une seule suffit !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre du Club Avatar de StephBretagne
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 147
    Points : 69
    Points
    69
    Par défaut
    Hello, je me permets de revenir sur ce post, car j'avais le même souci.

    Je créais une nouvelle base et j'ajoutais ma première table de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS formaDoc (
      idFormDoc varchar(4) UNIQUE NOT NULL,
      nomFormDoc_fr varchar(255) NOT NULL,
      nomFormDoc_en varchar(255) NOT NULL,
      CONSTRAINT pk_formaDoc
    		PRIMARY KEY (idFormDoc)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
    et là, ça m'écrivait "Les index PRIMARY et idFormDoc semblent identiques et l'un d'eux pourrait être supprimé."

    Et bien c'était parce que idFormDoc était UNIQUE et donc considéré comme un Index mais en plus de ça j'écrivais que c'était une Primary en même temps.

    Donc, pour que ça ne fasse pas ça, il faut écrire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS formaDoc (
      idFormDoc varchar(4) NOT NULL,
      nomFormDoc_fr varchar(255) NOT NULL,
      nomFormDoc_en varchar(255) NOT NULL,
      CONSTRAINT pk_formaDoc
    		PRIMARY KEY (idFormDoc)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Discussions similaires

  1. mettre plusieurs légendes sur la même figure
    Par hulia dans le forum MATLAB
    Réponses: 1
    Dernier message: 23/04/2014, 17h02
  2. Mettre un style sur un tableau particulier dans une div
    Par matbde dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 03/05/2012, 16h30
  3. Réponses: 2
    Dernier message: 31/01/2009, 20h49
  4. Requête avec plusieurs paramètres d'un même champ d'une table
    Par jb.julien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/08/2007, 09h43
  5. Réponses: 4
    Dernier message: 26/04/2006, 14h02

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