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

PHP & Base de données Discussion :

Probleme requete trop lourde et tri [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Probleme requete trop lourde et tri
    Bonjour,

    J'ai un souci auquel je n'ai jamais eu a faire face c'est à dire charger un bon millier de resultats !

    Je m'explique, je suis en train de monter un annuaire.
    J'ai un peu moins de 1300 entrees dans ma base.
    j'ai donc une page annuaire qui n'affiche que par 20 resultats en page par page.

    malgré ca, ma page met environ 8sec pour se charger !!!

    voici ma requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select
    L.tous_mes_champs, (SUM(N.note_critere1)+SUM(N.note_critere2)+SUM(N.note_critere3)+SUM(N.note_critere4)+SUM(N.note_critere5))/(select COUNT(*) from table_commentaires N where N.id_lieu=L.id and N.valide='oui') as NoteTotale, 
    V.ville_id, V.ville_nom_reel as nomVille, V.ville_slug, V.ville_departement 
    from annuaire L 
    join villes V 
    on
    L.id_ville=V.ville_id left 
    join
    table_commentaires N on N.id_lieu=L.id  
    where
    L.valide='oui' 
    group by
    L.id 
    order by L.nom asc

    vous me direz en voyant ca que je charge toute ma base !!
    oui et c'est bien mon souci...

    en fait, les lieux que je charge sont notés (tri incorporé dans la requete), mais je fais aussi un tri en fonction de leur taux de remplissage (ca je ne sais sais absolument pas comment l'incorporer dans ma requete !!!
    du coup je fais un premier tri avec le requete du dessus. Je balance tout dans un array, et dans ce array, je calcule le taux de remplissage que j'integre au array dans le premier while, et apres je fais un foreach avec mes filtres et tris...

    et le page par page joue sur l'affiche du array.

    du coup, comment pourrais-je contourner ce probleme et ne pas charger a chaque affichage toute ma table ???

    merci d'avance !!
    et bon weekend a tous

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu devrais écrire proprement tes requêtes, parce qu'il y a trop de choses dans celle que tu nous as montré.
    J'espere que c'est juste un problème de copier/coller.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    L.tous_mes_champs, V.ville_id, V.ville_nom_reel as nomVille, V.ville_slug, V.ville_departement , (SUM(N.note_critere1)+SUM(N.note_critere2)+SUM(N.note_critere3)+SUM(N.note_critere4)+SUM(N.note_critere5))/(select COUNT(*) AS note
    FROM table_commentaires N
    JOIN annuaire L 
    JOIN villes V ON L.id_ville=V.ville_id left 
    WHERE L.valide='oui' 
    GROUP BY L.id 
    ORDER BY L.nom asc

    Ensuite pour ton problème de remplissage, il faudrait nous expliquer comment tu veux le calculer.

    Pour ton problème de temps, il faudrait deja voir combien de temps mets la requête pour s'executer nue.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu devrais écrire proprement tes requêtes, parce qu'il y a trop de choses dans celle que tu nous as montré.
    J'espere que c'est juste un problème de copier/coller.
    si malheuresement c'est bien ma requete, et encore je vous ai enlevé toute la liste de tous les champs !!!

    Citation Envoyé par sabotage Voir le message
    Ensuite pour ton problème de remplissage, il faudrait nous expliquer comment tu veux le calculer.
    j'ai determiné tous les champs important de ma table, et je parcours tous les remplit avec un select classique, et j'increment une variable que je divise par le nombre de champs important

    Citation Envoyé par sabotage Voir le message
    Pour ton problème de temps, il faudrait deja voir combien de temps mets la requête pour s'executer nue.
    je passe de l'execution sans while derreire à 0.08 s de chargement
    à 11.5 s avec le while derreire ou je creer mon array avec le taux de remplissage, sans l'affiche du foreach du array

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Dans ton phpmyadmin, tu testes ce genre de requêtes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	select 
    	id_lieu,
    	SUM(note_critere1)+SUM(note_critere2)+SUM(note_critere3)+SUM(note_critere4)+SUM(note_critere5) as total
    	from table_commentaires
    	group by id_lieu
    	where valide='oui'

    Quand ça fonctionne, tu l'intègres dans une table temporaire et tu testes le code SQL suivant :
    D'abord, tu crées la table temporaire c_remplissage, ensuite, tu pars de cette table temporaire avec id_lieu unique pour joindre les autres tables.
    Ca devrait être très performant, si tu n'as que 1000 tuples.
    Code SQL : 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
     
    CREATE TEMPORARY TABLE IF NOT EXISTS c_remplissage AS (
    	select 
    	id_lieu,
    	SUM(note_critere1)+SUM(note_critere2)+SUM(note_critere3)+SUM(note_critere4)+SUM(note_critere5) as total
    	from table_commentaires
    	group by id_lieu
    	where valide='oui'
    );
    select a.tous_mes_champs,
    V.ville_id, V.ville_nom_reel as nomVille, V.ville_slug, V.ville_departement,
    c.total
    from c_remplissage c
    inner join annuaire a on c.id_lieu=a.id and a.valide='oui'
    left join villes V on V.ville_id=a.id_ville
    order by a.nom asc;
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu devrais écrire proprement tes requêtes, parce qu'il y a trop de choses dans celle que tu nous as montré.
    J'espere que c'est juste un problème de copier/coller.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    L.tous_mes_champs, V.ville_id, V.ville_nom_reel as nomVille, V.ville_slug, V.ville_departement , (SUM(N.note_critere1)+SUM(N.note_critere2)+SUM(N.note_critere3)+SUM(N.note_critere4)+SUM(N.note_critere5))/(select COUNT(*) AS note
    FROM table_commentaires N
    JOIN annuaire L 
    JOIN villes V ON L.id_ville=V.ville_id left 
    WHERE L.valide='oui' 
    GROUP BY L.id 
    ORDER BY L.nom asc

    Ensuite pour ton problème de remplissage, il faudrait nous expliquer comment tu veux le calculer.

    Pour ton problème de temps, il faudrait deja voir combien de temps mets la requête pour s'executer nue.
    Ahhh je ne connaissais pas les tables temporaires ! enfin, je ne les ai jamais utilisées !!
    merci de ta reponse, je vais tester ca, enfn, je vais le tester pour autre chose, parce que la j'ai resolu mon souci en creant un champs supplementaire dans ma table annuaire qui s'appelle taux_remplissage, et chaque ajout, ou modification d'entree de l'annuaire, je calcule ce taux a la volée et apres je fais juste un tri dans mon order by....
    bon, c pas simple simple, mais c'est ce que j'ai trouvé en attendant
    merci beaucoup en tout cas !

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    j'ai donc une page annuaire qui n'affiche que par 20 resultats en page par page.
    Ce qui me paraît étrange c'est qu'il n'y a aucune limite dans ta requête alors qu'avec ton système de pagination cela devrait retourné les résultats 20 par 20 !
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    En fait avant mes derniers changement le "limit 20" était dans le array qui suivait.
    Mais maintenant avec mon nouveau champs et la nouvelle façon de faire du coup j'ai pu remettre le limit 20 dans ma requête initiale

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

Discussions similaires

  1. [V6] Probleme de requetes trop lourdes
    Par olivier45fr dans le forum Deski
    Réponses: 0
    Dernier message: 06/08/2013, 13h57
  2. requete trop lourde ORACLE 9.2
    Par glood1 dans le forum SQL
    Réponses: 2
    Dernier message: 18/09/2009, 09h57
  3. [Vue-OPTIMISATION] probleme de vue trop lourde a chargée
    Par Valkirion dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2009, 00h27
  4. [Débutant] Aide pour requete trop lourde
    Par Faiche dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/12/2008, 11h32
  5. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40

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