Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/10/2007, 19h26   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 2
Points : 2
Par défaut [SQL] Optimisation de mes requêtes SQL

Bonjour à tous, afin d'optimiser et d'accélérer mes requetes, j'ai suivi beaucoup de conseil pour optimiser ma base et afficher les données le plus rapidement possible.

A la recherche de la meilleure optimisation possible, j'hésite entre deux méthodes pour enregistrer les scores de mes joueurs :
- une table "score" : on ajoute le score du joueur quand il gagne un puzzle
- une table "score_total" : on update le score_total du joueur quand il gagne un puzzle

cette méthode me permet ensuite d'afficher plus rapidement le classement des joueurs puisque je n'ai plus qu'a trier la table "score_total" par ordre décroissant.

ou bien

- une table "score" : on ajoute le score du joueur quand il gagne un puzzle

puis lorsqu'on affiche le classement général des scores je fais,
SELECT SUM(points), joueur AS somme FROM "score" GROUP BY joueur ORDER BY somme DESC

mais cette requete est tres lente, ma table "score" contient plus de 2 millions de lignes.

Merci d'avance de votre aide.
webAbsolu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 10h41   #2
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Bonjour,
Citation:
une table "score_total" : on update le score_total du joueur quand il gagne un puzzle
ça a l'air préférable, sauf si tu dois pouvoir récupérer plus tard le score pour tel ou tel puzzle pour tel joueur (ie : voir tous les scores du meme joueur pour chaque puzzle).

Si tu n'as pas besoin de cette fonction , alors tu n'auras au pire que deux champs à retourner pour chaque utilisateur

Code :
SELECT points, joueur FROM score_total ORDER BY points DESC LIMIT x
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 14h34   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 2
Points : 2
Oui merci de ta réponse. Mais justement j'affiche aussi pour chaque joueur tous les puzzles qu'il a réussi.

Pour essayer d'alléger ma table des scores, je pensais faire un classement général par mois (et ainsi conserver les scores uniquement du mois en cours) car aujourd'hui je conserve les scores par puzzles de chaque joueur, ca représente 2 millions de ligne.

Mais je ne sais pas comment faire pour calculer le score mensuel d'un joueur, si j'utilise ma premiere méthode, il faudrait que je créé une table pour chaque mois ? pour chaque année ?

si j'utilise la seconde méthode, vu qu'il y a 2 millions de ligne a trier par joueur et par mois et faire la somme, la requete est beaucoup trop lourde.

Si quelqu'un a des idées, merci d'avance.
webAbsolu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 15h25   #4
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Citation:
Mais je ne sais pas comment faire pour calculer le score mensuel d'un joueur,
Si tu as un champ date dans la table, tu peux sortir seulement pour une période donnée (BETWEEN). Tu ne ressortiras donc pas tes 2000000 de lignes.
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 16h54   #5
Invité de passage
 
Inscription : octobre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 5
Points : 2
Points : 2
Oui mais dans ce cas je suis obliger de faire :

SELECT DISTINCT joueur, SUM(points) AS somme FROM table_score WHERE date BETWEEN date1 AND date2 GROUP BY joueur ORDER BY somme DESC


et cette requete prend 10 sec à s'exécuter. C'est beaucoup trop lent.
webAbsolu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h32.


 
 
 
 
Partenaires

Hébergement Web