Il s'agit d'une requête qui totalise les résultats de jeu de chaque joueur et affiche les joueurs qui correspondent aux conditions.Quelle est la meilleure façon d'optimiser cette requête MySQL?
select *,
(kills/deaths) as killdeathratio,
(totgames - wins) as losses
from (select gp.name as name,
gp.gameid as gameid,
gp.colour as colour,
Avg(dp.courierkills) as courierkills,
Avg(dp.raxkills) as raxkills,
Avg(dp.towerkills) as towerkills,
Avg(dp.assists) as assists,
Avg(dp.creepdenies) as creepdenies,
Avg(dp.creepkills) as creepkills,
Avg(dp.neutralkills) as neutralkills,
Avg(dp.deaths) as deaths,
Avg(dp.kills) as kills,
sc.score as totalscore,
Count(*) as totgames,
Sum(case
when ((dg.winner = 1 and dp.newcolour < 6) or
(dg.winner = 2 and dp.newcolour > 6))
then 1
else 0
end) as wins
from gameplayers as gp,
dotagames as dg,
games as ga,
dotaplayers as dp,
scores as sc
where dg.winner <> 0
and dp.gameid = gp.gameid
and dg.gameid = dp.gameid
and dp.gameid = ga.id
and gp.gameid = dg.gameid
and gp.colour = dp.colour
and sc.name = gp.name
group by gp.name
having totgames >= 30
) as h
order by totalscore desc
Maintenant, je ne suis pas trop sûr quelle est la meilleure façon d'aller, mais ce serait à votre avis est d'optimiser cette requête? Je lance un Q6600 @ 2.4ghz, 4gb de RAM, un système Linux Ubuntu 9.04 64 bits et cette requête peut prendre jusqu'à 6.7 secondes (j'ai une énorme base de données).
Aussi je voudrais paginer les résultats aussi bien et l'exécution des conditions supplémentaires au-dessus de cette requête est beaucoup trop lent ....
J'utilise django comme frontend donc toutes les méthodes qui incluent l'utilisation de Python +/- Les méthodes django seraient géniales. MySQL, Apache2 tweaks sont également les bienvenus. Et bien sûr, je suis ouvert à changer la requête pour la faire fonctionner plus vite.
Merci d'avoir lu ma question; hâte de lire vos réponses!
Edit: EXPLIQUER Regrouper les résultats
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 783 Using filesort
2 DERIVED sc ALL name,name_2 NULL NULL NULL 2099 Using temporary; Using filesort
2 DERIVED gp ref gameid,colour,name name 17 development.sc.name 2
2 DERIVED ga eq_ref PRIMARY,id,id_2 PRIMARY 4 development.gp.gameid 1 Using index
2 DERIVED dg ref gameid,winner gameid 4 development.ga.id 1 Using where
2 DERIVED dp ref gameid_2,colour gameid_2 4 development.ga.id 10 Using where
Que dit EXPLAIN de la requête? Cela donne-t-il des indications sur les index potentiels que vous pourriez créer? –
Mis à jour avec les résultats d'explication; va ajouter ces clés et voir si les résultats ont changé. – fivetwentysix
En outre, puisque vous sélectionnez à partir d'une table dérivée, vous pouvez essayer de "déplacer" la table dérivée dans une vue. Cela peut aider à accélérer un peu la requête puisque "hints" devrait être disponible pour la vue (c'est la connaissance prise de MS SqlServer, donc je ne suis pas sûr combien cela s'applique à MySql). –