IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Calcul de classement [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut Calcul de classement
    Salut

    Pour un jeux en ligne je doit réaliser des classements des joueurs (plus de 50 000). Jusqu'a présent les classements sont calculés en temps réel si ils ont besoin d'etre affiché.

    Si c'est pour afficher le classement d'une seule personne, cela ne pose pas de probleme, par contre pour afficher la page de classent de tous les joueurs (100 par pages), la page met plus d'une 10aine de seconde avant de s'afficher.

    J'aimerai donc changer le systeme de calcul des classement pour les calculer par exemple toutes les heures ou toutes les nuit dans un rcon.
    J'ai donc rajouter un champ "rank" ou je metrais le cassement à jour à chaque calcul.

    Par contre le calcul pour mes 50 000 entrées est tres long : environ 90 minutes.

    Je voudrais savoir si vous savais comment optimiser le truc ou si il existe d'autres méthodes pour accelerer le truc ?

    voila mon script de mise à jour :
    (les classement se font par nombre de points, si le nome de point de 2 joueurs sont identique, alors c'est le nombre de victoire qui départagera, et si les victoires sont elle aussi identique alors ce sera celui qui aura le moins de defaite qui sera devant)

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $crankq = mysql_query("SELECT * FROM `table`");
    while ($crank = mysql_fetch_array($crankq)){
    	// Calcul du rank
    	$rankdq = mysql_query("SELECT COUNT(*) as `rank` FROM `table` WHERE (`points`>".$crank['points'].") OR ((`points`=".$crank['points'].") AND (`victoire`>".$crank['victoire'].")) OR ((`points`=".$crank['points'].") AND (`victoire`=".$crank['victoire'].") AND (`defaite`<".$crank['defaite']."))");
    	$rankd = mysql_fetch_array($rankdq);
     
    	$rank = $rankd['rank'] + 1;
     
    	mysql_query("UPDATE `table` SET `rank`=".$rank." WHERE `id`=".$crank['id']);
    }

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    J'ai réussi à passé à 13 minutes en passant par une seule requete plutot que de boucler sur tous les enregistrements :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE `table` as p1 
    SET p1.`rank`= (
    SELECT COUNT(p2.`id`) 
    FROM (SELECT * FROM `table`) as p2 
    WHERE (p2.`points`>p1.`points`) OR ((p2.`points`=p1.`points`) AND (p2.`victoire`>p1.`victoire`)) OR ((p2.`points`=p1.`points`) AND (p2.`victoire`=p1.`victoire`) AND (p2.`defaite`<p1.`defaite`))
    )

  3. #3
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    En plaçant des index sur les champs `points`, `victoire` et `defaite` j'ai l'impression que le site se charge beaucoup plus vite !

    Les pages de classement se chargement maintenant instantanément contre plusieur seconde avant.

    Mais c'est peut etre le fait que ce soit une periode creuse ou il n'y a pas beaucoup de gens sur le site, je vérifirais ce soir.

    Par contre meme avec ces index, ma requete amélioré sur mon post juste avant met toujours autant de temps (un peu moins d'un quart d'heure).

    Pensez vous que c'est du au fait que la requete cré une table temporaire (p2) et que c'est dans cette table qu'elle recherche ? Les index sont il pris en compte dans la table temporaire ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer un classement
    Par laurentSc dans le forum Requêtes
    Réponses: 11
    Dernier message: 21/04/2012, 13h01
  2. [MySQL] Faire une table classement ou calculer le classement à chaque fois?
    Par Snipy dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/09/2010, 17h45
  3. Calcul du classement d'équipes de football
    Par patrick2010 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 28/02/2010, 22h49
  4. [CR XI] Calcul d'un classement/rang
    Par silversatch62 dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 06/08/2009, 11h29
  5. Calcul du classement d'équipes de football
    Par speedster dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 22/01/2007, 21h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo