Page trop lourde, trop de resultats !
Résolu
diice
Messages postés
131
Date d'inscription
Statut
Membre
Dernière intervention
-
diice Messages postés 131 Date d'inscription Statut Membre Dernière intervention -
diice Messages postés 131 Date d'inscription Statut Membre Dernière intervention -
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 :
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
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:
- Page trop lourde, trop de resultats !
- Impossible de supprimer une page word - Guide
- Resultats foot - Télécharger - Vie quotidienne
- Reduire un document trop lourd - Guide
- Numéro de page word - Guide
- Imprimer tableau excel sur une page - Guide
4 réponses
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.
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.
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 !!
c'est bien mon souci !!
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.
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 ??
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 ??
ç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 :)
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 :)
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,
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,