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 :

Requete qui augmente de 5 s le délai d'attente de la page


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut Requete qui augmente de 5 s le délai d'attente de la page
    Bonjour,

    J'ai un problème avec cette requête:

    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
    SELECT this.CodeFlux AS CodeFlux, TitreFlux, ajouter.NomFlux AS NomFlux, (
     
    	SELECT COUNT( * )
    	FROM item, ajouter, flux
    	WHERE flux.CodeFlux = ajouter.CodeFlux
    	AND item.CodeFlux = flux.CodeFlux
    	AND flux.CodeFlux = this.CodeFlux
    	AND item.CodeItem NOT
    		IN (
     
    		SELECT CodeItem
    		FROM afficher
    		WHERE CodeMembre = '1'
     
    		)
     
    ) AS NewItem
    FROM ajouter, flux AS this
    WHERE ajouter.CodeMembre = '1'
      AND ajouter.CodeFlux = this.CodeFlux
    ORDER BY NomFlux
    Le délai d'attente des pages sur lesquels cette requête est exécutée:



    Cette requête n'est-elle pas assez optimisée sachant que le délai d'attente augmente en fonction du nombre de résultat ?

    En executant cette requete directement dans MySQL:

    Affichage des enregistrements 0 - 21 (22 total, Traitement en 2.3808 sec.)
    Ça me parait un peu long non ?

    Ce problème est présent uniquement sur mon dédié, en local je n'ai aucun problème.

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Ta requête est tellement tordue que c'est difficile de comprendre ce qu'elle est censée faire mais est-ce que celle-ci ne donnerait pas le même résultat :
    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
    SELECT this.CodeFlux AS CodeFlux, 
      TitreFlux, 
      ajouter.NomFlux AS NomFlux,
      COUNT( * ) AS NewItem
    FROM ajouter
    INNER JOIN flux AS this ON ajouter.CodeFlux = this.CodeFlux
      INNER JOIN item ON this.CodeFlux = item.CodeFlux
    WHERE ajouter.CodeMembre = '1'
      AND item.CodeItem NOT IN (
     
            SELECT CodeItem
            FROM afficher
            WHERE CodeMembre = '1'
     
            )
    ORDER BY NomFlux
    Sinon donne-nous une description des tables et un besoin clair.
    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 !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Les tables:
    Flux : Enregistrer les URL de flux XML
    Membre: Enregistre les membres
    Ajouter: Association entre les membres et les flux (un flux peut etre ajouté par plusieurs membres)
    Item : Enregistre les items de chaque flux
    Afficher : Dès qu'un membre affiche un item sur son écran, la référence de l'item est enregistré dans cette table (CodeMembre, CodeItem).

    La requête doit afficher tous les flux que le membre possède ainsi que le nombre d'items que le membre n'a pas encore affiché.

    Le requête donnée n'affiche qu'un seul flux au lieu de la totalité.

    J'ai réduit le temps de chargement à 0,68 s avec la requete suivante:

    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
    SELECT this.CodeFlux AS CodeFlux, TitreFlux, ajouter.NomFlux AS NomFlux, (
     
    SELECT COUNT( * )
    FROM item
    WHERE item.CodeFlux = this.CodeFlux
    AND item.CodeItem NOT
    IN (
     
    SELECT CodeItem
    FROM afficher
    WHERE CodeMembre = '1'
    )
    ) AS NewItem
    FROM ajouter, flux AS this
    WHERE ajouter.CodeMembre = '1'
    AND ajouter.CodeFlux = this.CodeFlux
    ORDER BY NomFlux
    C'est pas un peu long 680 ms pour une requête de ce type ?

    Ya t'il moyen de réduire encore ce temps de chargement ?

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Vous ne trouvez pas ça un peu elevé 680 ms pour cette requête ?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT f.CodeFlux, f.TitreFlux, a.NomFlux
        COUNT (*) AS NewItem
    FROM flux AS f
    INNER JOIN ajouter AS a ON a.CodeFlux = f.CodeFlux
    INNER JOIN item AS i ON i.CodeFlux = f.CodeFlux
      LEFT OUTER JOIN afficher AS af ON af.CodeItem = i.CodeItem
    WHERE a.CodeMembre = 1
      AND af.CodeMembre = 1
      AND af.CodeItem IS NULL
    GROUP BY f.CodeFlux, f.TitreFlux, a.NomFlux
    ORDER BY a.NomFlux
    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 !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Salut,

    Il n'y aurai pas une erreur de syntaxe avant le COUNT(*) ?

    Mysql me retourne :

    MySQL a répondu: Documentation
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(*) AS NewItem
    FROM flux AS f
    INNER JOIN ajouter AS a ON a.CodeFlux = f.CodeFlux' at line 2
    Merci

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Oui, il manque une virgule après a.NomFlux.
    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 !

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Oui, j'avais vu cette erreur de syntaxe mais il me retournait quand même cette erreur en corrigeant celle çi:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(*) AS NewItem
    FROM flux AS f
    INNER JOIN ajouter AS a ON a.CodeFlux = f.CodeFlux' at line 1

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Donne nous le texte de la requête que tu as envoyée au serveur et qui provoque cette erreur.
    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 averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Salut,

    Lors de l'erreur précédente j'ai fait une erreur, au lieu de placer une virgule j'ai placé un point ...

    Cependant, la requete me retourne l'erreur suivante:

    requête SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT f.CodeFlux, f.TitreFlux, a.NomFlux, COUNT( * ) AS NewItem
    FROM flux AS f
    INNER JOIN ajouter AS a ON a.CodeFlux = f.CodeFlux
    INNER JOIN item AS i ON i.CodeFlux = f.CodeFlux
    LEFT OUTER JOIN afficher AS af ON af.CodeItem = i.CodeItem
    WHERE a.CodeMembre =1
    AND af.CodeMembre =1
    AND af.CodeItem IS NULL
    GROUP BY f.CodeFlux, f.TitreFlux, a.NomFlux
    ORDER BY a.NomFlux
    LIMIT 0 , 30
    MySQL a répondu:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS NewItem
    FROM flux AS f
    INNER JOIN ajouter AS a ON a.CodeFlux = f.CodeFlux
    ' at line 2
    Merci

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    C'était une erreur au niveau du COUNT(*), il fallait juste supprimer les espaces à l'intérieur de la parenthèse.

    Cependant, il ne me retourne aucun résultat au lieu des 22 attendu...

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Et comme ç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
    24
    SELECT
        f.CodeFlux,
        f.TitreFlux,
        a.NomFlux,
        COUNT(*) AS NewItem
    FROM
        flux AS f
        INNER JOIN ajouter AS a
          ON a.CodeFlux = f.CodeFlux
        INNER JOIN item AS i
          ON i.CodeFlux = f.CodeFlux
        LEFT OUTER JOIN afficher AS af
          ON af.CodeItem   = i.CodeItem
         AND af.CodeMembre = 1
    WHERE
        a.CodeMembre = 1
    AND af.CodeItem IS NULL
    GROUP BY
        f.CodeFlux,
        f.TitreFlux,
        a.NomFlux
    ORDER BY
       a.NomFlux ASC
    LIMIT 0 , 30

  13. #13
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Effectivement,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     af.CodeMembre = 1
      AND af.CodeItem IS NULL
    a peu de chance de se vérifier puisque, dans l'absolu, la colonne af.CodeItem est probablement déclarée comme NOT NULL s'agissant d'une clef étrangère.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  14. #14
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Salut,

    La requête fonctionne mais n'affiche pas la bonne réponse:

    Il affiche toust les flux disponibles ainsi que le nombre total d'item que chaque flux comporte (au lieu des nouveaux uniquement).

    De plus, la requête s'exécute en 420 ms, c'est normal pour ce genre de requête où c'est mon serveur (https://www.ovh.com/fr/commande/kimsufi.cgi?hard=093sk1) ?

    Les INNER JOIN sont-ils plus optimisé ?

    Je vais regarder la requête

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Et si vous donniez quelques données pour qu'on puisse tester ?

  16. #16
    Membre chevronné
    Avatar de kedare
    Homme Profil pro
    Network Automation Engineer
    Inscrit en
    Juillet 2005
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Network Automation Engineer

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 548
    Points : 1 860
    Points
    1 860
    Par défaut
    Un petit explain voir même un show profile all ne serait pas de refus

  17. #17
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    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
    EXPLAIN SELECT flux.CodeFlux AS CodeFlux, TitreFlux, ajouter.NomFlux AS NomFlux, (
     
    SELECT COUNT( * )
    FROM item
    WHERE item.CodeFlux = flux.CodeFlux
    AND item.CodeItem NOT
    IN (
     
    SELECT CodeItem
    FROM afficher
    WHERE CodeMembre = '1'
    )
    ) AS NewItem
    FROM ajouter, flux
    WHERE ajouter.CodeMembre = '1'
    AND ajouter.CodeFlux = flux.CodeFlux
    ORDER BY NomFlux
    Me donne:


  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Je ne suis pas un as de l'interprétation des EXPLAIN mais il me semble que quand il n'y a que PRIMARY dans la colonne Possible keys, cela veut dire que le seul index existant sur la table est la clé primaire non ?
    Il faudrait indexer la colonne CodeFlux dans les tables 'item' et 'ajouter'.
    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 !

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2009, 11h39
  2. [SQL] une requete qui fait mal a la tete
    Par MailOut dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/02/2005, 17h22
  3. une requete qui fonctionne aux 3/4...
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 23h08
  4. [VB6] recuperer une requete qui renvoie du xml
    Par voyageur dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/12/2004, 11h03
  5. Requete qui ne s'occupe pas de la casse
    Par tripper.dim dans le forum SQL
    Réponses: 2
    Dernier message: 09/12/2004, 20h17

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