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 :

MySQL jointure sur clé primaire LENTE


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut MySQL jointure sur clé primaire LENTE
    Bonjour,

    Je fais appel à votre aide car j'ai un problème de temps d'exécution sur une requete impliquant une jointure sur une clé primaire.
    Je travaille sur une base MySQL.

    Voici ma base :

    3 tables :

    entreprise (id_entr, nom, adresse... )
    motcle (id_mot, valeur)
    entr_mot (num_entr, num_mot)

    Il s'agit tout simplement de lier des entreprises avec des mots clés pour faire un petit moteur de recherche. Mon jeu de test comporte 100 000 entreprises, 50 000 mots clés et 1 700 000 tuples dans la table "entr_mot" liant les entreprises et les mots clés.


    A cette structure très simple viennent s'ajouter quelques index :

    table "entreprise" :
    - une clé primaire sur id_entr

    table "motcle" :
    - une clé primaire sur id_mot
    - un index fulltext sur valeur (utilisé pour les recherche de type MATCH... AGAINST...)

    table "entr_mot" :
    - un index sur num_entr
    - un index sur num_mot




    Voici la requête que je réalise sur cette base :

    SELECT num_entr
    FROM motscle
    INNER JOIN entr_mots ON (id_motcle=num_motcle)
    INNER JOIN entreprise ON (id_entr=num_entr)
    WHERE MATCH(valeur) AGAINST('+voiture' IN BOOLEAN MODE)
    OR MATCH(valeur) AGAINST('+rouge' IN BOOLEAN MODE)
    GROUP BY num_entr
    HAVING COUNT( num_entr ) = 2
    LIMIT 0 , 30

    C'est à dire que je recherche toutes les entreprises qui sont liées à la fois au mot voiture et au mot rouge.

    Mon problème :

    - Cette requête est excessivement lente avec la clé primaire id_mot (20 à 30 secondes).

    - Si je supprime cette clé primaire ou que je la remplace par un index classique, alors la requête est quasiment instantanée (moins de 0.5 secondes).

    - Si je ne réalise le test que sur un seul mot clé (donc en supprimant la ligne avec le OR) alors la requête est également instantanée même avec la clé primaire !


    N'hésitez pas à me faire partager vos connaissances. Merci pour votre aide.

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Solution
    Mon problème est résolu. Il ne faut pas cumuler 2 match mais lister tous les mots clés dans le même MATCH. Simple en fait !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    match(valeur) against ('rouge voiture' IN BOOLEAN mode)

  3. #3
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Merci pour ta réponse, par contre pense au tag résolu stp
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

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

Discussions similaires

  1. [MySQL] Jointure sur une même table
    Par LostRailler dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/09/2011, 17h19
  2. Réponses: 2
    Dernier message: 23/06/2011, 11h14
  3. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  4. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2005, 23h54
  5. [MYSQL] Question sur jointure
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/10/2005, 11h46

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