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 :

Requête trop lente


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut Requête trop lente
    bonjour
    j'ai 3 niveau de catégories.
    catégorie niveau 0,niveau 1 et niveau 2
    j'ai des centaines de catégorie au niveau 1 et des milliers de categories au niveau 2
    j'aimerais savoir comment ecrire autrement cette requete car j'ai des centaines de or pc.categories_id = et la requete ne semble pas du tout optimisée .c'est assez lent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where p.products_model REGEXP 'zz' and (pc.categories_id =1045 or pc.categories_id =1046 or pc.categories_id =1047 or pc.categories_id =1048 or pc.categories_id =1049 or pc.categories_id =1050 or pc.categories_id =1051 or pc.categories_id =1052 or pc.categories_id =1053 or pc.categories_id =1061 or pc.categories_id =1063 or pc.categories_id =90094 or pc.categories_id =90095 or pc.categories_id =90096 or pc.categories_id =90097 or pc.categories_id =90098 or pc.categories_id =90099 or pc.categories_id =90100 or pc.categories_id =90101 or pc.categories_id =90103 or pc.categories_id =90104 or pc.categories_id =90105 or pc.categories_id =90106 or pc.categories_id =90107 or pc.categories_id =90108

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pour simplifier l'écriture (et la lecture), tu pourrais utiliser l'opérateur IN (liste).
    Quant à l'amélioration des temps de traitement, un index sur pc.categories_id serait peut-être utile, associé certainement à d'autres colonnes qui n'apparaissent pas pas dans l'extrait de requête que tu donnes.
    Enfin l'expression p.products_model REGEXP 'zz' sera bien plus efficacement traité sous la forme p.products_model = 'zz'. Nul besoin d'expression régulière ici.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    c'est une bonne idée .voici la requete complète .pour simplifier la lecture du code j'ai enlevé pc.categories_id = car il y en a beaucoup
    vous me proposez quoi comme requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from products p left join products_description pd on p.products_id=pd.products_id left join products_to_categories pc on p.products_id = pc.products_id left join categories c on c.categories_id = pc.categories_id left join categories_description cd on cd.categories_id = pc.categories_id where p.products_model REGEXP 'mv[0-9\\.]+' or p.products_model_f REGEXP 'mv[0-9\\.]+' and (pc.categories_id =1045 or pc.categories_id =1046 or pc.categories_id =1047 or pc.categories_id =1048 or pc.categories_id =1049  or pc.categories_id =93105 or pc.categories_id =93106 or pc.categories_id =93107 or pc.categories_id =93108 or pc.categories_id =93109 or pc.categories_id =93110 or pc.categories_id =93111 or pc.categories_id =93112 or pc.categories_id =93124 or pc.categories_id =93125 or pc.categories_id =93126 or pc.categories_id =93127 or pc.categories_id =93128 or pc.categories_id =93129 or pc.categories_id =93130 or pc.categories_id =93131 or pc.categories_id =93132) and (p.codeF !=2 and p.codeF !=11 and p.codeF !=12 and p.codeF !=13) group by p.products_id order by p.products_model,c.parent_id asc

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    il faut associer pc.categories_id à quelle colonne?

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Votre requête est illisible, un peu de mise en forme vous aurait permis de remarquer que vous combinez des OR/AND dans la restriction sans mettre les parenthèses requises, le résultat ne sera certainement pas celui souhaité !
    La liste à rallonge de valeurs possibles pour pc.categories_id pourait être avantageusement remplacée soit par in(liste) soit par une table dérivée
    select * est à proscrire, surtout avec plusieurs tables en jointure

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    que de bons conseils merci

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    En mettant un peu en forme ta requête, on arrive à ça :
    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
    23
    select  * 
    from    products p 
        left join 
            products_description pd 
            on  p.products_id=pd.products_id 
        left join 
            products_to_categories pc 
            on  p.products_id = pc.products_id 
        left join 
            categories c 
            on  c.categories_id = pc.categories_id 
        left join 
            categories_description cd 
            on  cd.categories_id = pc.categories_id 
    where   p.products_model REGEXP 'mv[0-9\\.]+' 
        or  p.products_model_f REGEXP 'mv[0-9\\.]+' 
        and pc.categories_id in (1045, 1046, 1047, 1048, 1049
            , 93105, 93106, 93107, 93108, 93109, 93110, 93111, 93112
            , 93124, 93125, 93126, 93127, 93128, 93129, 93130, 93131, 93132) 
        and p.codeF not in (2, 11, 12, 13) 
    group by p.products_id 
    order by p.products_model
        ,   c.parent_id asc
    Ne serait-ce pas un peu plus lisible ?
    Il ne fait pas avoir peur d'ajouter des sauts de lignes et des indentations dans une requête SQL. Ils n'ont aucun effet sur l'interprétation et l'exécution de la requête mais assurent une meilleure lisibilité.

    Comme l'a fait justement remarquer escartefigue, la combinaison de AND et de OR sans parenthèses peut amène à un résultat qui ne sera sans doute pas celui escompté.
    Voici la manière dont la condition est traitée. Est-ce bien celà ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    where   p.products_model REGEXP 'mv[0-9\\.]+' 
        or  (   p.products_model_f REGEXP 'mv[0-9\\.]+' 
            and pc.categories_id in (1045, 1046, 1047, 1048, 1049
                , 93105, 93106, 93107, 93108, 93109, 93110, 93111, 93112
                , 93124, 93125, 93126, 93127, 93128, 93129, 93130, 93131, 93132) 
            and p.codeF not in (2, 11, 12, 13)
            )
    Dans le cas contraire, des parenthèses sont indispensables autour des condition REXEP.

    Enfin, l'usage d'une restriction sur pc.categories dans la clause WHERE convertit de fait la jointure externe sur la table en jointure stricte.
    Si ce n'est pas ce qui est attendu, il faudrait déplacer cette condition dans l'expression de jointure correspondante.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    select * est à proscrire, surtout avec plusieurs tables en jointure
    pourquoi çà?

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il vaut mieux éviter la guerre des étoiles !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quant à l'amélioration des temps de traitement, un index sur pc.categories_id serait peut-être utile, associé certainement à d'autres colonnes
    je dois faire quoi précisément

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Commencez par étudier le plan d'exécution de la requête à l'aide d'EXPLAIN.
    Vous pouvez d'ailleurs nous donner le résultat et on vous donnera des pistes pour améliorer l'indexation de vos tables.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    voici le resultat d explain
    Nom : 0img20.jpg
Affichages : 136
Taille : 67,3 Ko

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On voit donc que l'index p.codeF n'est pas utilisé et que la table p renvoie plus de 20 000 lignes. C'est probablement la cause de la lenteur de la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where   p.products_model REGEXP 'mv[0-9\\.]+' 
        or  (   p.products_model_f REGEXP 'mv[0-9\\.]+'
    Je ne suis pas très calé en REGEXP mais si je comprends bien, vous cherchez ce qui commence par 'mv' puis un chiffre. Si tout ce qui commence par mv est toujours suivi d'un chiffre, peut-être que placer des index sur les colonnes p.products_model et p.products_model et utiliser LIKE dans votre condition de jointure améliorerait les choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where   p.products_model LIKE 'mv%' 
        or  (   p.products_model_f LIKE 'mv%'
    Mais vérifiez quand même que cela correspond bien à ce que vous cherchez et que cela n'altère pas le résultat obtenu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    pour repondre à ali.c'est bien çà que je cherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where   p.products_model REGEXP 'mv[0-9\\.]+' or  p.products_model_f REGEXP 'mv[0-9\\.]+'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    where   p.products_model REGEXP 'mv[0-9\\.]+' or  p.products_model_f REGEXP 'mv[0-9\\.]+' 
            and pc.categories_id in (1045, 1046, 1047, 1048, 1049
                , 93105, 93106, 93107, 93108, 93109, 93110, 93111, 93112
                , 93124, 93125, 93126, 93127, 93128, 93129, 93130, 93131, 93132) 
            and p.codeF not in (2, 11, 12, 13)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    @cine
    je prefere regex.c'est nettement plus complet

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il ne s'agit pas de préférer mais de choisir la solution la plus efficiente !
    REGEX entraînera la non utilisation d'un éventuel index.
    Si un LIKE 'debut_du_texte%' donne le même résultat, c'est lui qu'il faut utiliser parce que le SGBD pourra utiliser l'index et ce sera plus performant.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    regex est nettement plus riche en terme de requete .je ne peux m'en passer

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Une fusée spatiale est nettement plus rapide... Donc, quand vous irez chercher votre paquet de clope au coin de la rue, pensez à y aller en fusée spatiale...

    Au fait quel grand dialoguiste disait "Les cons, ça ose tout... C'est même à ça qu'on les reconnaît" ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    regex est nettement plus riche en terme de requete .je ne peux m'en passer
    je ne parle pas de rapidité mais de possibilité de requete avec regex que like ne peut le faire .oui il me faut une fusée pour aller dans l'espace et pas un vélo.

Discussions similaires

  1. Optimisation de requêtes trop lentes..
    Par Nevrosl dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/03/2010, 13h38
  2. requête trop lente
    Par smaildba dans le forum SQL
    Réponses: 9
    Dernier message: 20/04/2009, 12h20
  3. Requête trop lente
    Par shadeoner dans le forum SQL
    Réponses: 11
    Dernier message: 23/05/2008, 10h24
  4. Requête trop lente, comment l'optimiser?
    Par getz85 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 29/01/2008, 13h40
  5. auto-killer une requête trop lente
    Par Nico57 dans le forum Oracle
    Réponses: 5
    Dernier message: 05/12/2006, 18h04

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