Page 1 sur 1

Probleme requete trop lourde et tri...

Posté : 11 oct. 2014, 08:01
par diice
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 :
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

Re: Probleme requete trop lourde et tri...

Posté : 11 oct. 2014, 09:59
par moogli
Salut,


Il y a de multiple raison pour chargement long.
Pour commencer si tu patine je pense que le plus simple c'est de limiter le nombre retourner (c'est possible plus ou moins facilement avec tous les SGBD. Mysql propose limit, oracle avec le row count ou mieux avec les fonçtion olap et un with).

Maintenant il faut voir si le problème c'est la requête ou le traitement.
Est ce que tu regarder avec Chrome et l'onglet réseau (sur l'outils développeur que tu as ouvre avec F12 ou ctrl + i sous Windows) tu as aura le temps de tout ce qui ce charge sur ta page, fichier php, css mais aussi image.

Côté code avec xdebug tu peux utiliser le profilage histoire de voir où ce trouve le les goulets d'étranglement dans ton code.

Côté requête 1300 lignes c'est rien pour un SGBD c'est fait pour des millions de lignes.
Par contre côté optimisation sur que le subselect et le left join (surtout ce dernier) ça doit pas aider. A voir.

@+

Re: Probleme requete trop lourde et tri...

Posté : 11 oct. 2014, 10:06
par diice
merci tout d'abord de ta réponse !

ensuite,le probleme si je limite mes resultats, c'est que je ne peux plus faire de tri par taux de remplissage, puisque je n'arrive pas a mettre ce calcul dans ma requete de base. ce pourquoi je passe tout dans un array auquel j'ajoute ce fameux taux, calculé avec un select classique...

j'ai regardé dans une page vide avec juste ma requete sans traitement, sans while derriere, et je suis à environ 0.08s de chagement.
par contre, des que j'execute le while pour creer mon array auquel j'ajoute mon calcul du taux de remplissage, la je passe à 10s ! et j'ai pas lanché encore le foreach pour l'affichage....

ok nikel et ouf pour le nombre d'enregistrement ;) c une premiere pour moi ! ;)

Re: Probleme requete trop lourde et tri...

Posté : 15 oct. 2014, 08:14
par moogli
Salut,

Désolé pour la réponse tardive qui va peux t'aider, mais sans le code on ne peux pas trop t'aider.

Tous ce que je peux te dire c'est que théoriquement tu devrais pouvoir faire ton calcul en sql afin de soulage le traitement php et faire bosser le serveur sql qui apres tout est fait un peu pour ça aussi :)


@+

Re: Probleme requete trop lourde et tri...

Posté : 15 oct. 2014, 08:37
par diice
Désolé pour la réponse tardive qui va peux t'aider, mais sans le code on ne peux pas trop t'aider.
c deja bien gentil de t'y pencher ;)
Tous ce que je peux te dire c'est que théoriquement tu devrais pouvoir faire ton calcul en sql afin de soulage le traitement php et faire bosser le serveur sql qui apres tout est fait un peu pour ça aussi :)
ca, ca serait vraiment top si j'arrivais a calculer mon taux de remplissage en sql, mais malheuresement je ne vois absolument pas comment faire !
je suis obliger de balancer des conditions php pour savoir si tel ou tel champs est remplit, et comptabiliser le nombre de remplit, et le nombre total... et ca, je ne vois pas trop comment faire en sql...

mais sinon, j'ai "resolu" mon probleme, en prenant une alternative. j'ai creé un champs 'taux_remplissage' dans ma table et a chaque creation ou modification d'une entree, hop ca calcul le taux, comme ça ca le fait a la volée une fois par une fois, au lieu de le faire 1300 fois dont 1280 pour rien !

je vais mettre resolu, mais si tu as une idée de piste pour calculer en sql le taux je suis preneur ;)

merci encore !