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

Outils MySQL Discussion :

union très lent


Sujet :

Outils MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Par défaut union très lent
    Bonjour,

    J'ai deux tables très différentes sur lesquelles je veux faire un UNION pour pouvoir crées des flux xml.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    (
    SELECT p.id AS pid, p.message, p.poster, p.posted, t.id, t.subject, t.num_replies, t.last_post, f.id AS fid, f.forum_name, f.quickpost, c.cat_name
    FROM posts AS p
    INNER JOIN topics AS t ON p.id = t.last_post_id
    INNER JOIN forums AS f ON f.id = t.forum_id
    INNER JOIN categories AS c ON f.cat_id = c.id
    LEFT JOIN forum_perms AS fp ON ( fp.forum_id = f.id
         AND fp.group_id =3 )
    WHERE (
         fp.read_forum IS NULL
         OR fp.read_forum =1
         )
         AND t.moved_to IS NULL
    )
    UNION 
    (
    SELECT id AS pid, description AS message, 'p' AS poster, date_validation AS posted, id, titre AS subject, 'n' AS num_replies,date_validation AS last_post, 999 AS fid, 'f' AS forum_name, 'q' AS quickpost, 'c' AS cat_name
    FROM annu_sites
    WHERE activation =1
    )
    ORDER BY last_post DESC
    LIMIT 20
    La réquête marche, mais est beaucoup trop longue + de 3 secondes alors que si j'exécute les deux requêtes séparément j'ai moins de 0.5 secondes pour la première et moins de 0.1 pour la deuxième.
    0.5 + 0.1 != 3 ... Est-ce normal ? Comment accélerer ma requête principale ?

    Je suis avec mysql 4.1

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Par défaut
    Salut,

    Oui cela semble normal que ta requête soit plus longue à executer, car ici :

    - Pour chaque lignes de ta requête 'principale', tu fais un accès sur la sous-requete. (Ex : 0.5 + 0.1 = 0.6 mais 0.5 + 0.1*nb_lignes ça fait plus)

    Je ne sais pas vraiment quoi te conseiller pour améliorer cela mais par exemple pour Oracle j'utilise Toad qui m'analyze les requetes et m'affiche les 'full access table', ça peut aider. Je ne sais pas si Toad pour MySQL ou MySQL Administrator le font.

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Par défaut
    Comprends pas ! Quelle sous-requête ?

    J'ai essaye de réduire le nb d'élément remonté par la requête 2 (de 1000 à 4) en ajoutant une condition, mais cela ne change rien au temps de calcul ...
    Des idées ?

  4. #4
    Membre éclairé Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Par défaut quelques pistes de réflexion
    Je veux bien croire que chaque requête séparemment est rapide.
    je ne sais pas combien de lignes sont ramenées par ta requête mais :
    - le order by à la fin est très gourmand en calcul
    - le union par défaut élimine les lignes doublons et ça aussi c'est couteux

    La seule piste que je peux te suggérer est de placer un 'explain' devant ta requête pour voir comment celle-ci est évaluée.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Par défaut
    Citation Envoyé par jp_rennes
    - le order by à la fin est très gourmand en calcul
    non pas tant que ça, je gagne un peu en l'enlevant, mais vraiment pas grand chose ...
    Citation Envoyé par jp_rennes
    - le union par défaut élimine les lignes doublons et ça aussi c'est couteux
    La par contre tu as raison en limitant le nb de retour dans les 2 requêtes je repasse sous les 0.7 secondes. C'est bien mais ce n'est pas très satisfaisant . N'y a t'il pas un moyen de contraindre Union d'enlever les doublons ? Ou peut-etre est-ce une autre commande ?

    Merci

    Edit : Vu UNION ALL mais cela ne change rien par rapport à UNION à partir du momment ou les deux requêtes ne retourne qu'un numbre limité de lignes. En mettant UNION ALL à la place de UNION sur la requete initiale on gagne environ 1 seconde mais ce n'est pas assez performant.

    Un explain de la requete avec UNION ALL me donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    id      select_type    table        type    possible_keys                            key                    key_len    ref               rows    Extra          
    1       PRIMARY        f            ALL     PRIMARY                                  NULL                   NULL       NULL              27                     
    1       PRIMARY        t            ref     topics_forum_id_idx,topics_moved_to_idx  topics_forum_id_idx    4          f.id              1357    Using where    
    1       PRIMARY        p            eq_ref  PRIMARY                                  PRIMARY                4          t.last_post_id    1                      
    1       PRIMARY        c            eq_ref  PRIMARY                                  PRIMARY                4          f.cat_id          1                      
    1       PRIMARY        fp           eq_ref  PRIMARY                                  PRIMARY                8          const,f.id        1       Using where    
    2       UNION          annu_sites   ALL     NULL                                     NULL                   NULL       NULL              1222    Using where    
    NULL    UNION RESULT   <union1,2>   ALL     NULL                                     NULL                   NULL       NULL              NULL    Using filesort
    Qq'un peut m'expliquer ?

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Je ne connais pas les détails liés à l'implémentation mais as-tu essayé de:

    1) créer une table temporaire, faire un INSERT IGNORE INTO... SELECT (IGNORE = à cause des doublons) avant de fair un SELECT * FROM table_temp ORDER BY ... ?

    2) D'avoir 2 curseurs qui parcours les résultats des 2 SELECT (triés) tout en s'assurant que le résultat reste ordonné et ne comporte pas de doublons ?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre chevronné Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Par défaut
    sur ta table annu_sites, presque sur que ta pas d´index sur activation.

    et si l´explain que ta mis, est avec union all, il lit les lignes que je t´ai dis.

  8. #8
    Membre chevronné Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Par défaut
    et sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    INNER JOIN forums AS f ON f.id = t.forum_id
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    INNER JOIN forums AS f  where t.forum_id=f.id
    t.forum_id et f.id, index, cle, unique?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 94
    Par défaut
    léger gain en indexant activation
    par contre pas de changement visible avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN forums AS f  where t.forum_id=f.id
    f.id = PRIMAIRE
    forum_id = Index

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par fpouget
    léger gain en indexant activation
    par contre pas de changement visible avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN forums AS f  where t.forum_id=f.id
    Normal: c'est (sensiblement) la même chose.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 18h17
  2. Ouverture et fermeture de base très lent...
    Par Tofdelille dans le forum Installation
    Réponses: 6
    Dernier message: 19/09/2006, 19h51
  3. [Lomboz] Editeur jsp très lent
    Par lr dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 29/01/2005, 20h43
  4. SQL Server trés lent
    Par arwen dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 07/11/2003, 15h45

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