JeuWeb - Crée ton jeu par navigateur
Réquetes multiples... optimisation??? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Réquetes multiples... optimisation??? (/showthread.php?tid=3642)



Réquetes multiples... optimisation??? - atra27 - 07-09-2010

Bonjours tous!

Alors voila, mon probléme se situe au niveau du transfert des ressources de l'inventaire d'un joueur a celui d'un autre joueur lorsqu'un combat est résolu.

Enfaite pour le moment j'ai une table inventory avec des champs tels que:
id idowner idobject quantity place
id: id du champ
idowner: id du joueur qui le posséde
idobject: id de l'objet
quantity: quandtité
Place: (dans le cas d'inventaires multiples)

Afin d'eviter les doublons d'objet (méme idobject) pour un méme owner et méme place, je suis obligé de faire un select afin de définir si je dois faire un update (si on a déjà ce type d'objet) ou un insert (si c'est le premier de ce type dans cet inventaire).

Dans le cas d'un vol, j'ai le fret total du vainqueur, auquel je soustrait les quantités des objects qu'il a déjà -> "SELECT SUM(quantity)"

Ensuite je charge dans un array tous les object du perdant qui sont dans son inventaire.
j'ai modif le script du topic de zeppelin pour qu'il me retourne un array avec l'id du champ, et la nouvelle quantité a assigner (ie la quantité restante)...

Sauf que mtn... a par une boucle foreach qui update la quantité au perdant (ou delete si =0), un select pour voir si l'objet est déjà dans l'inventaire du gagnant, puis un update ou un insert... et ce pour tousles objets volés...
Sachant qu'il peut y en avoir beaucoup... (de l'ordre d'une 10aine... peut étre plus...)

Cette fois j'ai vraiment besoin d'aide... mon architecture me semble pas super adaptés... quoique y a pas tellement de meilleur moyen enfaite Confused ou en tous cas je vois pas...

Je sais pas si c'est super clair... et désolé pour le pavé :$

Mon pb exact est que le nombre de requetes est de:
2 select pour les carac des joueurs
2 update pour les pv restants
1 select pour l'argent
2 update pour le transfert d'argent
1 select pour le fret dispo
1 select pour les ressources "vollables"
1*n select (ou n est le nombre de ressources vollées réellement retourné par le script)
2*n update (ou n est le nombre de ressources vollées réellement retourné par le script)
Ce qui me fait en moyenne 12 requetes rien que pour calculer le combat... (a ajouter les requetes spécifiques a la page demandée)


RE: Réquetes multiples... optimisation??? - Anthor - 07-09-2010

Pourquoi penses-tu que 12 requêtes doivent être optimisées ?

Tu as profilé pour voir si ça ralentissait ?
Tu as remarquer un réponse lente ?


RE: Réquetes multiples... optimisation??? - atra27 - 07-09-2010

Pour 12 requetes sa va... mais si l'un a par exemple 10 objets... sa me fait passer a 9+10+20=39 requetes...

Sachant que c'est juste le calcul du combat, donc qu'il peut y avoir une autre action a effectuer juste dérriére (entre 3 et 5 requetes en moyenne)

Si il n'y a pas d'autres moyens sa me comviendrai mais par principe une requete (enfin 3 dans ce cas) dans une boucle sa ne me convient pas vraiment :$
Aprés je m'embete peut étre pour rien...


RE: Réquetes multiples... optimisation??? - php_addict - 07-09-2010

J'imagines que tu connais les jointures genre INNER JOIN et LEFT JOIN, oui ?

tu peut même faire une jointure sur une même table avec les alias, genre:

INNER JOIN table as t on t.id = table.unchamps


Et J'imagines que tu connais les requetes imbriquées genre:

SELECT pseudo FROM table WHERE id=(SELECT expediteur FROM mp WHERE mp.id=135)


quel est ton temps d'exucution?

PS: j'avous ne pas avoir entierement compris toutes les requetes...j'vais allez prendre l'apero, alors...


RE: Réquetes multiples... optimisation??? - atra27 - 07-09-2010

A vrai dire la seule optimisation est de récupérer en UNE requête les objets du gagnant et du perdant...
Comme sa a partir de la je peut calculer la place restant au gagnant et je sais aussi quels objets il a donc je sais si je dois faire un update ou bien un insert.

J'économise une requête avant et le select a chaque boucle...

Mon probléme n'est pas tellement niveau timing... mais j'avoue que je ne maitrise pas super bien...

Reste a me dire que sa sera exécuté disons... 5 fois par jour grand maximum pour 100 joueurs...


RE: Réquetes multiples... optimisation??? - php_addict - 07-09-2010

tu ne m'a pas répondu...


RE: Réquetes multiples... optimisation??? - atra27 - 07-09-2010

Le probléme de la jointure c'est que je cherche a affecter une valeur que mysql ne peut pas trouver en lui même...
et que chaque valeur doit être affectée a un champ a partir de son id...
En gros faire un update tel que si id=1 alors quantité=20, si id=2 alors quantité=55 etc...
Finalement c'est plus long a l'exec que de faire des multiples requêtes...

Pour le temps d'exécution je n'ai pas encore les chiffres pour le script complet...


RE: Réquetes multiples... optimisation??? - srm - 07-09-2010

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
Tiens pour faire un insert/update en une requête.