Page 1 sur 1

Nombre de requètes moyennes / pages

Posté : 28 nov. 2008, 17:05
par Number
Bonjours a tous,

Je continue mon petit bonhomme de chemin en php..
Et me voila maintenant avec un petit site fonctionnel (personnel).

Ayant créé une classe mysql, j'ai pu compter le nombre de requêtes sur chaque pages.

J'en suis à :
3 requêtes pour l'utilisateur (Vérifier session(1), prendre les configurations perso(1),mise à jours de la session(1))
4 requêtes pour le design (Affichage du menu(1),des blocs et configuration(2),des droits(1))
8 pour les statistiques (Nbr de connecté(4),Nbr d'inscris(1),Nbr de co sur Irc(1),Nbr de salle irc(1),Nbr de serveur(1))
2 pour le contenu (En moyenne, varie en fonction des pages)

17 : Total

Pour le nombre de connecté il y'a 4 requètes car :
- Vérification si utilisateur déjà présent dans la table online
- Mise à jours des info sur l'utilisateur dans online (dernier rafraichissement) ou insertion .
- Suppression des utilisateurs de la vaille dans online
- Comptabilisation du nombre de connecté dans online


Voici les requêtes :

Code : Tout sélectionner

DELETE FROM users_sessions WHERE session_life < NOW() SELECT users.id,users.pseudo,users.level,users_sessions.sid FROM users,users_sessions WHERE users.id = '1' AND users_sessions.user_id=users.id AND users_sessions.sid='' UPDATE users_sessions SET page='index.php?page=chans',derniere_visite=NOW() WHERE user_id='1' SELECT level FROM site_access WHERE page='chans' SELECT * FROM site_config SELECT * FROM site_menu ORDER BY parents SELECT * FROM site_widgets ORDER BY ordre ASC SELECT * FROM stats_online WHERE ip='127.0.0.1' UPDATE stats_online SET time='1227868627' WHERE ip='127.0.0.1' DELETE FROM stats_online WHERE date<='2008-11-27' SELECT COUNT(0) AS total FROM users SELECT count(0) FROM stats_online WHERE time > '1227868327' SELECT COUNT(0) AS total FROM denora_user SELECT COUNT(0) AS total FROM denora_chan SELECT COUNT(0) AS total FROM denora_server SELECT count(0) as Nbr_Chan FROM chan SELECT * FROM chan ORDER BY channel ASC LIMIT 0,20
Pensez-vous que 17 requêtes pour une page entièrement dynamique soit de trop?
Voyez-vous un moyen d'optimiser ça ?

Pour info, les tables denora_user,denora_chan,denora_server ne sont pas de moi, mais proviennent des tables générées par Denora (irc stats serveur)

Merci à vous !

Posté : 28 nov. 2008, 18:24
par AB
17 requêtes pour afficher une page, heureusement que tu parles d'un petit site... quand tu en feras des gros ça va monter à combien ? Franchement ça me paraît largement too much

Posté : 28 nov. 2008, 19:24
par caroube
Je ne sais pas à quoi correspondent tes statistiques. Si elles te sont utiles, alors non 17 ce n'est pas trop.

Par contre, il y a peut être des requêtes que tu n'es pas obligé de faire à chaque affichage de page, mais peut être une fois par jour, ou une fois par heure. Surtout dans les systèmes de stats, on n'est pas obligé de travailler en temps réel et ne donner que les informations statistiques qui datent d'une heure, d'un jour ou d'un mois.

Posté : 28 nov. 2008, 22:21
par Number
Merci pour vos réponse..

Bah disons que les statistiques ne sont pas obligatoire non !!
Maintenant qu'est-ce qui est raisonnable 5 , 10 ?

Comment faire mieux que c'est 4 requêtes : http://www.allhtml.com/articles/detail/258 pour un live counter ?
Déjà si on retire les stats (irc et live couner) ca ne fait plus que 10 !!

Posté : 29 nov. 2008, 12:45
par katagoto
17 requêtes, c'est trop :/
Je penses que tu pourrais faire un système de cache, un système où tu regroupe les UPDATE/DELETE ensemble, ou avec un SELECT, ce ne sont que dees suggestions...

Posté : 29 nov. 2008, 16:20
par AB
Difficile en fait de te dire ce qui est raisonnable, cela dépend de tes besoins.

Disons que le mieux est d'essayer d'en faire le moins possible ... c'est une question d'optimisation. Evidemment plus tu en fais, plus la base sera sollicitée et moins tu pourras avoir de connexions simultanées sur ton site (ou plus tu auras besoin de puissance).

Maintenant le nombre de requêtes n'est pas le seul élément significatif. Pour obtenir un même résultat il est parfois plus rapide de faire deux requêtes que d'en faire une seule... Et puis une seule requête sur des centaines de milliers d'enregistrements prendra plus de ressources que plusieurs sur des petites tables.

Donc ben faut faire des bench pour mesurer le temps nécessaire à l'exécution de l'ensemble de tes requêtes.

EDIT Déjà tu pourrais commencer par optimiser tes requêtes. Un "SELECT *..." est moins optimisé que si tu indiques le nom de tes champs, excepté dans le cas particulier d'un SELECT count(*)

Posté : 30 nov. 2008, 11:18
par Ryle
Je rejoint AB. Il n'y a pas de nombre moyen ou raisonnable de requête, tout dépend du besoin. Et contrairement à ce qui a pu être dit plus haut il est impossible de dire qu'un nombre de requête est trop elevé sans connaitre la structure et la volumétrie de la base, le nombre d'utilisateurs simultanés, ni la capacité du serveur.

Maintenant il est indéniable qu'il faut toujours mieux essayer d'optimiser tes requêtes et de limiter les connexions à la base de données lorsque tu n'en as pas besoin (c'est aussi un confort pour l'utilisateur qui verra sa page se chargée plus vite :)).

Donc en effet, appuye toi sur les conseils d'optimisation qui ont été donnés, eux en revanche sont toujours bons à prendre :) (Ex evite le "SELECT *", conserve des résultats en cache - les infos de l'utilisateur peuvent rester en session, les stats en fragment html que tu peux inclure et que tu mets à jour lorsqu'ils changent, etc.)

Posté : 01 déc. 2008, 11:24
par Number
Grâce a vos conseille, j'ai réussi a réduire déjà le nombre de requêtes à 15.

Une n'etait pas obligatoire à chaque chargement de page
L'autre, a été supprimée grâce a une optimisation de la base de donnée..

Mais bon, 15 me semble encore beaucoup.
Je pourrais supprimer les 4 requêtes permettant de comptabiliser le nombre de connecté et du coup, je passerais a 11. Mais c'est toujours trop, alors peut être avez-vous des idées ?

Je serais curieux de connaître le nombre de requêtes de la page d'accueil de phpbb..


Edit :
Je viens de passer à 12 requêtes :
- Suppression du nombre de personnes en ligne, je n'affiche que les membres co - 3 requêtes
- Suppression d'un select de configuration du site (le tout dans un fichier config)

Edit 2

Est-ce mieux cette requête sur chaque page qui vérifie que l'user est co + récupération des config :
SELECT users.id,users.pseudo,users.level,users_sessions.sid FROM users,users_sessions WHERE users.id = '1' AND users_sessions.user_id=users.id AND users_sessions.sid=''
Ou alors enregistrer id,pseudo,level,sid dans une session, et juste vérifier que sid est présent dans user_session ?

Sachant que le pseudo peut être modifié, le level aussi

Merci

Edit 3
A l'aide d'un event journalier je viens de passer à 11 requêtes..
Toutes les requêtes restantes sont obligatoire.

Vous trouvez que c'est mieux ?