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 :

Jointure très longue (49 minutes)


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut Jointure très longue (49 minutes)
    bonjour à tous, j'ai besoin de retourner les enregistrements d'une table à dont le champ name est égal au champ word d'une autre table.

    je procède donc ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql> SELECT a.name FROM names as a, words as b where a.name = b.word;
    seulement ... chaque table contient environ 150000 enregistrements uniques.
    et tout cela prends 49minutes environ à répondre

    comment puis-je optimier ?
    un index ne sert pas à grand chose je pense vu que ce sont des enregistrements uniques dans chaque table.

    Merci d'avance.
    Damien

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Si l'index va probablement améliorer les choses parce que 49 mn pour une requête aussi simple et sur un volume de données pas énorme, c'est vraiment beaucoup trop !

    Un article à lire sur les index.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    oui en effet c'est tres long
    quel est le type de tes colonnes?(varchar ou autre?)

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Cybher Voir le message
    quel est le type de tes colonnes?(varchar ou autre?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT a.name FROM names AS a, words AS b WHERE a.name = b.word
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Bonjour,

    L'utilisation d'un index et une écriture normalisé (même si MySQL fait tout des optimisations il me semble) augmenterons la vitesse de réponse.

    Avec un produit cartésien comme tu fais ça donne une nombre de retours égal à 150000² soit 22500000000 tuples.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE names ADD CONSTRAINT U_NAMES_NAME UNIQUE (name);
    ALTER TABLE words ADD CONSTRAINT U_WORDS_WORD UNIQUE (word);
    Puisque tu dit que les tuples sont uniques, l'utilisation de la contrainte unique cré automatique un index (utile pour faire le contrôle de l'intégrité au plus vite).

    Sinon tu peut créer les index comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX U_NAMES_NAME ON names (name);
    CREATE INDEX U_WORDS_WORD ON words (word);
    Puis une requête sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.name
    FROM names AS a
    INNER JOIN words AS b ON a.name = b.word;
    Attention, la performance d'un index dépend du nombre distinct de valeurs sur la colonne indexé par rapport au nombre total de valeurs.
    Plus le ratio (nombre de valeurs distinctes / nombre total de tuple) est proche de 1, et plus l'index sera utile.
    A noter que sur une table MyIsam si 30% des données indexés sur une colonne sont des doublons, les index ne servirons a rien, ce qui n'est pas le cas avec des tables InnoDB.

    (Si ced passe par la, un petit clin d'œil )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Merci à tous de vos réponses, je jette un oeuil à tout ca je vous tiens au courant

  7. #7
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT a.name FROM names AS a, words AS b WHERE a.name = b.word
    il aurait pu tres bien utiliser un type text et donc dégrader les perfs

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

Discussions similaires

  1. [AJAX] Passage d'une variable très longue avec AJAX
    Par Figaro83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/09/2006, 16h53
  2. Réponses: 12
    Dernier message: 09/09/2006, 11h54
  3. Réponses: 4
    Dernier message: 09/12/2005, 08h25
  4. Comment écrire une très longue variable dans un fichier ?
    Par hijodelanoche dans le forum Langage
    Réponses: 8
    Dernier message: 17/11/2005, 16h12
  5. Acquisition longue, très longue...
    Par pc.bertineau dans le forum Windows
    Réponses: 3
    Dernier message: 24/02/2005, 13h54

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