Page trop lourde, trop de resultats !

Résolu/Fermé
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 - 11 oct. 2014 à 07:55
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 - 13 oct. 2014 à 09:22
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

A voir également:

4 réponses

Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
11 oct. 2014 à 09:31
Bonjour,
Pour mysql, essaye un Limit 0,20 à la fin déjà.
Sinon, si tu a moyen de déplacer le recherche de commentaire dans une autre requête, tu devrais y trouver ton compte.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
11 oct. 2014 à 09:35
oui mais du coup si je met le limit 20, je ne pourrai pas retrier derriere avec mon fameux taux de remplissage que je suis suis obligé de faire sur toute ma table pour retrier derriere !
c'est bien mon souci !!
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
11 oct. 2014 à 16:54
Essaye déjà de ne récupérer les commentaires que pour les 20 que tu affiche (donc dans une deuxième requête dans ta boucle) si possible.
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
11 oct. 2014 à 21:21
Oui ça c possible...
En fait il vaut mieux faire plusieurs requêtes pour récupérer les infos (commentaires, villes, styles etc...) qui sont dans d'autres bases plutôt que d'en faire qu'une qui regroupe tout c çà avec des jointe et tout le touttim ? En terme de chargement et d'affichage c'est plus rapide ??
0
Nhay Messages postés 838 Date d'inscription vendredi 2 novembre 2012 Statut Membre Dernière intervention 17 décembre 2015 126
12 oct. 2014 à 10:33
ça dépends du contexte, là le problème c'est que tu récupère 1300 lignes, et tu fais donc des jointure pour chacune d'entre elles alors que seulement 20 seront utilisé.
Donc tu fais 1280 jointures pour rien.
Après, le mieux serait surement de faire une requête count() à côté pour récupérer le nombre total.
Y'a qu'en testant que tu verra ce qui est le plus rapide :)
0
diice Messages postés 131 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 25 février 2017 1
13 oct. 2014 à 09:22
merci beaucoup de tes reponse et de ton aide !
en fait j'ai choisi une autre alternative !

j'ai ajouté un champs a ma table "Taux_remplissage" qui se remplit a chaque creation ou modification de l'id de la table concerné... comme ca, je fais juste un tri dans le order by, et je peux donc mettre le limit 20 sans souci en place !
la page s'affiche quasi instantanément maintenant...

merci encore !
et bonne journée a toi,
0