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 :

Non coincident MySQL (Left Join)


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Non coincident MySQL (Left Join)
    J'ai fait une requête qui doit rechercher tout les entrées d'une table B qui ne sont pas dans la table A (MySQL).
    La requête fonctionne très bien avec des très petites tables (10 registres maxi) mais quand je l'essaie sur mes deux tables avec chacune 60.000 registres, je n'ai aucun résultat
    Les deux tables ont la même structure

    Id | Fam | Nom | genre

    Le Id est indexé sur les deux table et je fait ma recherche sur le champs Fam qui est numérique. Fam, nom et genre ne sont pas unique et donc non indexable

    La requête est

    SELECT * FROM Table_B LEFT JOIN Table_A ON Table_B.fam = Table_A.fam
    WHERE Table_A.fam Is Null;

    J'ai essayé sur access et surprise en 2 secondes ça marche . Je me plante où ?

    Merci de votre aide


    Remiguel

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    avec cette requete tu ne récupere pas les enregistrements de B qui ne sont pas dans A mais seulement les enregistrements de B qui contiennent une valeur dans "Fam" qui n'existe pas dans la table A
    et comme tu le dit toi même, le champ "Fam" ne contient pas des valeurs uniques donc c'est normal que tu n'obtiens pas ce que tu veux

    j'en profite pour citer la signature de Yabo :
    _________________
    Troisième loi de Greer:
    Un programme informatique fait ce que vous lui dites de faire, pas ce que vous voudriez qu'il fasse.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Je me suis peut être mal exprimé. Je recherche bien tout les registres ou enregistrements "Fam" de B qui ne sont pas dans A.
    Par contre ce type de requête demande-t-il que fam soit indexé et unique ?
    Pourquoi ça marche avec des tables de même structure et 10 registres chacune ?
    Pourquoi ça marche sur Access (qui n'est pas tasse de thé) avec la même requête SQL ?
    Je suis surpris, lors de ma requête qu'aucun message d'erreur me soit parvenu. Je n'ai tout bonnement aucun résultat rien nada comme si la requête était toujours en cours après l'avoir lancé 4 heures auparavant. Etrange.

    Des idées ? suggestion de requête ? par avance merci


    Remiguel

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'ai fait plusieurs essais dont un en limitant les résultats :

    SELECT Table_B.fam, Table_B.text FROM Table_B LEFT JOIN Table_A ON Table_B.fam = Table_A.fam
    WHERE Table_A.fam Is Null AND Table_B.Id < 20;

    La requête marche . c'est long mais au bout de 40 seconde j'ai mon résultat

    Je pense donc que c'est un problème de buffer à régler. Mais je ne sais pas vraiment lequel

    J'ai essayé ça sans beaucoup de résultat : safe_mysqld -O key_buffer=64M -O table_cache=256*-O sort_buffer=4M -O read_buffer_size=1M &

    A vrai dire je crois que la commande n'est pas prise en compte, car je manque d'expérience sur ce domaine. Quelqu'un pourrai m'orienter.
    Es ce possible que ce soit un problème de buffer ? dois je impérativement changer la taille du Buffer par le terminal ou je peux le faire avec la fonction SET dans mon interface favorite ?

    Par avance merci

    Remiguel

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'ai parametré MySQL comme suit

    SET GLOBAL join_buffer_size = 131072;
    SET GLOBAL key_buffer_size =64000000;
    SET GLOBAL table_cache =256000;
    SET GLOBAL sort_buffer_size =10000000;
    SET GLOBAL read_buffer_size=1000000;

    ça améliore un peu le temps de réponse. Puis en fouinant un peu je me suis aperçu que l'on pouvais indexer Fam en normal (accepte les doublons) et là, je peu dire au revoir à Access. Les requêtes Non coïncidentes sont immédiate.

    J'espère que cela pourra servir

    A+


    Remiguel

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    tu eux dire que en ajoutant un index tu as divisé par plus de 50 le temps de recherche des résultat ?
    si c'est ca je serai le premier intéressé !

  7. #7
    Candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Par 50 je ne sais pas, mais ma requête qui n'aboutissait pas fonctionne et avec un temps de réponse appréciable : 40s pour la recherche de non-coincident entre deux tables toutes deux de 60.000 entrées et 6500 registres trouvés (Immediat en limitant à 1000 registres).
    Access me donne le même résultat sans rien indexer .
    Comment peut on l'expliquer ?



    A+

    Remiguel

    Ma Config :
    Mac OSX.2.8; MYSQL 4.0.15, CocoaMySQL, YourSQL

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

Discussions similaires

  1. LEFT JOIN mysql
    Par Cyrius dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/05/2006, 10h12
  2. [MySQL 4.0.17] utilisation de LEFT JOIN 2 fois
    Par Zen_Fou dans le forum Administration
    Réponses: 4
    Dernier message: 26/04/2006, 13h55
  3. MYSQL Left Join
    Par Exo dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/04/2006, 15h16
  4. Plantage Mysql avec LEFT JOIN
    Par verticka dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/09/2005, 11h45
  5. [MySQL]probleme LEFT JOIN Mysql
    Par tatayoyo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/08/2005, 20h47

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