Optimisation select sur table MySQL

Fermé
fab13 - 4 nov. 2009 à 12:33
 fab13 - 4 nov. 2009 à 20:20
Bonjour,

J'ai un souci d'optimisation sur une requete MySQL]pour un site de petites annonce. J'ai une table annonce sur lequel je veux paginer avec un ordre de tri date ou prix, j'ai donc mis 2 indexs sur ces champs.
Lorsque j'ai environ 200000 enregs dans cette table avec 15 elements par page pour la pagination, la requete est rapide lors de l'affichage des premieres pages, mais est beaucoup plus lente lorsque je navigue sur les dernieres pages (5 secondes environ pour 200000 enregs en tout).
Quand je navigue sur un site comme LeBonCoin par exemple, la requete se fait sur un volume beaucoup plus gros et l'affichage est beaucoup plus rapide.
Comment puis je optimiser au mieux ma requete pour arriver à des resultats comme LeBonCoin ?

Ma requete de pagination est de la forme :
select * from annonces where .... order by date desc limit x, y

Merci
A voir également:

2 réponses

Giorgiolino Messages postés 253 Date d'inscription vendredi 15 mai 2009 Statut Contributeur Dernière intervention 2 mars 2015 52
4 nov. 2009 à 13:02
Bonjour,

la requête telle que tu l'as écrite me parait difficilement optimisable.
Il faudrait plutôt voir au niveau de la manière dont tu l'utilises.

La requête est-elle lancée à chaque appel de page ?


Si oui,

ça explique peut-être la lenteur, puisque qu'au fur et à mesure qu'on croît dans les numéros de page,
on doit parcourir de plus en plus d'enregistrements avant d'arriver aux données de résultat..

Au cas où cela ne serait pas encore fait, l'optimisation consisterait ici à lancer la requête une seule
fois et à mettre les données en cache. Les données seront ainsi accessible (un peu) plus rapidement
puisqu'il s'agirait d'une simple lecture de fichier et non de plus de l'interrogation d'une base de données.

Sinon

il faut peut-être voir du coté de la structure même de tes tables, voire de ton moteur de bases de
données. Mais là ça devient plus complexe.
0
Comment mettre en cache une telle requete avec une pagination ? Faut il l'executer sans le LIMIT ? Comprends pas.

J'aimerais bien savoir comment fait le Bon Coin pour avoir des temps de reponses pareils : 8 000 000 d'enregs et c quasi instantané sio tu vas sur les dernieres pages
0
Comment mettre les données en cache ? Je développe sur PHP avec serveur Apache.
0
Giorgiolino Messages postés 253 Date d'inscription vendredi 15 mai 2009 Statut Contributeur Dernière intervention 2 mars 2015 52
4 nov. 2009 à 15:32
Plutôt qu'un long discours, voici de la documentation qui te permettra d'y voir plus clair.

http://www.siteduzero.com/tutoriel-3-31906-comprendre-et-utiliser-un-systeme-de-cache-php.html

https://www.php.net/manual/fr/book.apc.php

http://www.codeartistique.com/2009/01/08/php-5-caching-de-donnees.html

PRINCIPE:
Mettre en cache dans ton cas consistera à stocker la page html générée par ta requête sql qui récupère
toutes les données.
Aller de page en page ne sera donc qu'une simple lecture du fichier html, ce qui est beaucoup plus
rapide.
Evidemment puisque les données dans ta base évoluent (ajouts/modifications/suppresssion), il
faudra paramétrer une durée de validité des données mises en cache. Ce sera à toi de la définir
en fonction de la fréquence des mises à jour.
0
fab13 > Giorgiolino Messages postés 253 Date d'inscription vendredi 15 mai 2009 Statut Contributeur Dernière intervention 2 mars 2015
4 nov. 2009 à 20:20
Ok je vois le principe mais dans mon cas c pas trop realiste, le resultat de la requete va evoluer d'heure en heure
et la requete totale pour constituer le fichier html de base mettrait 10 plombes : irrealiste pour mon site..
Je vais voir pour une autre solution, j'aimerais bien savoir comment fonctionne la pagination sur un site comme LeBonCoin, ca m'aiderait enormement.
0