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

Requêtes MySQL Discussion :

Optimiser une requête de "classement"


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 204
    Points : 159
    Points
    159
    Par défaut Optimiser une requête de "classement"
    Bonjour,

    Dans le fichier slow-query.log, j'ai une requête qui semble poser des problèmes.

    # Time: 060309 16:54:10
    # Query_time: 7 Lock_time: 0 Rows_sent: 100 Rows_examined: 279444
    use footlandv2off;
    SELECT joueurs.id,joueurs.nom,joueurs.equipe,equipes.nom,amicaux,coupes,champ FROM joueurs,equipes,buteurs WHERE joueurs.equipe = equipes.id AND buteurs.id = joueurs.id AND (amicaux+coupes+champ) != 0 ORDER BY (amicaux+coupes+champ) DESC, joueurs.nom ASC LIMIT 0,100;
    C'est un classement des meilleurs buteurs tous matchs confondus.
    Comme vous verrez, il y a trois tables nécessaires.
    La table principale est la table "buteurs" avec les champs "amicaux", "coupes" et "champ".

    Voyez-vous une solution pour optimiser cette requète sachant que j'ai besoin pour l'affichage de récupérer le nom du joueur, le nom de l'équipe et son nombre de but ?


    PS : je viens de voir une optimisation possible en regroupant les champs amicaux,coupes et champ à la table des joueurs. Si vous voyez une meilleure optimisation, merci.

  2. #2
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Est-ce que tu as des indexes sur les clés secondaires?

    Tu peux aussi mettre des indexes sur les champs un peu lourds en taille.

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    tib1664: +1


    J'imagine que la table "buteurs" a la cardinalité la plus faible. Si tu commençais par elle dans ton FROM?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM buteurs,joueurs,equipes
    Et si tu utilisais des INNER JOIN histoire de mettre de l'ordre?

    Enfin "(amicaux+coupes+champ) != 0" se simplifie par "(amicaux+coupes+champ)" ou même par "(amicaux OR coupes OR champ)" puisque la somme est toujours positive (mais là, c'est vraiment "hardcore" comme optimisation!)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 204
    Points : 159
    Points
    159
    Par défaut
    (amicaux OR coupes OR champ)

    Ah oui ça c'est pas bête, j'y avais pas pensé :p

    Mettre des INNER JOIN, ok on y verra mieux mais niveau performance ? Je ne pense pas que cela y change grand chose, j'avais déjà effectué des tests.

    Oui j'ai bien des index.

    Bon je fais l'optimisation à laquelle j'ai pensé, cela ferait déjà appel à une table de moins.

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Manu0086
    Mettre des INNER JOIN, ok on y verra mieux mais niveau performance ? Je ne pense pas que cela y change grand chose, j'avais déjà effectué des tests.
    C'est la grande question que je me pose: est-ce que MySQL optimise les jointures en fonction de la cardinalité des tables concernées? (ce qu'on appelle de la "programmation dynamique") Il semble que non (à l'heure actuelle).

    Sinon, quelle est la cardinalité (le nombre d'enregistrements) de tes tables?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 204
    Points : 159
    Points
    159
    Par défaut
    buteurs : 143000
    joueurs : 143000
    equipes : 9500

    Et cela augmente tous les jours...

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Et bien voilà une optimisation: tu ne fais qu'une seule table "joueurs" dans laquelle tu mets les informations sur les buteurs, cela évitera une GROSSE jointure (je viens de comprendre l'optimisation que tu voulais faire...)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 204
    Points : 159
    Points
    159
    Par défaut
    ouaip

    En posant moi-même la question, j'avais trouvé la solution principale :p

    pfff pourquoi quand on développe, on pense pas à tout.... quel temps qu'on perd ensuite :p

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

Discussions similaires

  1. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  2. Optimiser une requête..est-ce possible ?
    Par Thierry8 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/09/2005, 11h31
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

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