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 :

Query vraiment long


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut Query vraiment long
    Bonjour,
    J'ai parcouru le forum et a peu près tout internet sans réponse.
    Je fait un query sur ma DB MySQL pour trouver les rows ayant une assotiation nom et prénom identiques à une autre ligne (trouver les doublon quoi)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select * from b_contacts A 
    where CONCAT(name,family_name) in 
    (select CONCAT(name,family_name) from b_contacts B where B.id<>A.id) 
    ORDER BY A.family_name
    Cela marche, mais il faut 100 secondes à mon serveur pour exécuter ce query sur une table de 1500 enregistrements, alors que ton mes autres query sont instantanés.
    Qu'est ce qui peu bien prendre autant de temps ? Ou est mon erreur ?
    Merci pour vos réponses.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Citation Envoyé par islacoul12 Voir le message
    Bonjour,
    J'ai parcouru le forum et a peu près tout internet sans réponse.
    Tu aurais dû commencer par ici. Ca traite complètement la question des doublons, avec des requêtes optimisées .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Merci bcp Ced.
    Je ne m'explique pas de ne pas être tombé sur cet article.
    Merci en tt cas.

    Bonne journée.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Plus généralement, il faut absolument éviter le IN (sous-requête) avec MySQL. En effet, il ne cherche pas à détecter si la sous-requête est corrélée ou non, et la lance pour chaque ligne de la requête principale... c'est de l'anti-optimisation !

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Merci encore. Mais en appliquant le querry sugéré par l'article ci-dessus.

    Comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT *
    FROM   T_DOUBLON T1
    WHERE  EXISTS (SELECT *
                   FROM   T_DOUBLON T2
                   WHERE  T1.NUM <> T2.NUM
                     AND  T1.NOM    = T2.NOM
                     AND  T1.PRENOM = T2.PRENOM)
    Ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT *
    FROM   T_DOUBLON T1
    WHERE  EXISTS
       (SELECT *
        FROM   T_DOUBLON T2
        WHERE  T1.NUM <> T2.NUM
          AND  (LOWER(T1.NOM)    LIKE '%' + LOWER(T2.NOM) + '%'    OR LOWER(T2.NOM) LIKE '%' + LOWER(T1.NOM)+'%')
          AND  (LOWER(T1.PRENOM) LIKE '%' + LOWER(T2.PRENOM) + '%' OR LOWER(T2.PRENOM) LIKE '%' + LOWER(T1.PRENOM) + '%'))
    J'ai toujours des temps de plus d'une minute ! Alors qu'un select classic prend quelques milisecondes.

  6. #6
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut
    Essaie voir ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *, COUNT(*) AS nb 
    FROM b_contacts
    GROUP BY name, family_name
    HAVING nb > 1
    ORDER BY family_name
    Cela devrait être nettement plus rapide vu qu'il n'y a pas de sous-requête. Le désavantage, c'est que tu n'as plus qu'une réponse par couple prénom-nom présent plusieurs fois. Donc MySQL renvoie les données de premier enregistrement qu'il trouve.

    Vu le temps que tu cites, je pense néanmoins que c'est toujours plus rapide de faire comme cela, quitte à faire des SELECT avec les réponses que tu obitiens avec la requête ci-dessous pour compléter les informations.

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

Discussions similaires

  1. Query trop long
    Par Invité dans le forum InterBase
    Réponses: 2
    Dernier message: 04/02/2010, 18h46
  2. [TooltipText] Que faire quand il est (vraiment) trop long
    Par mavina dans le forum Composants
    Réponses: 5
    Dernier message: 31/03/2009, 09h22
  3. Long queries and undo
    Par bibi92 dans le forum Administration
    Réponses: 1
    Dernier message: 30/09/2008, 20h50
  4. Des includes vraiment trop longs
    Par hugo69 dans le forum Langage
    Réponses: 7
    Dernier message: 27/06/2008, 15h25
  5. Démarrage de windows vraiment très long
    Par krfa1 dans le forum Windows XP
    Réponses: 16
    Dernier message: 23/10/2005, 12h37

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