게임에서 모든 플레이어의 게임 결과를 합산하고 조건에 맞는 플레이어를 표시하는 쿼리입니다.이 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
지금 내가 갈 수있는 가장 좋은 방법은 무엇 너무 확실하지 않다하지만 당신의 의견에 어떤 것이 쿼리를 최적화 할 수?
Q6600 @ 2.4ghz, 4GB RAM, 64 비트 Linux Ubuntu 9.04 시스템을 실행하며이 쿼리는 최대 6.7 초가 걸릴 수 있습니다 (거대한 데이터베이스가 있음). 또한
나뿐만 아니라이 쿼리의 상단에 추가 조건을 실행하는 결과를 페이지를 매기 싶습니다이
내가 프론트 엔드로 파이썬을 사용하여 포함하므로, 어떠한 방법을 장고를 사용 .... 너무 느리다 +/- 장고 방법은 위대한 것입니다. MySQL, Apache2 개조도 환영합니다. 물론 쿼리를 변경하여 쿼리를 더 빠르게 실행할 수 있습니다.내 질문을 읽어 주셔서 감사합니다. 답을 읽기를 고대합니다!
편집 : EXPLAIN QUERY 모두의
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
EXPLAIN이 쿼리에 대해 말하는 것은 무엇입니까? 당신이 만들 수있는 잠재적 인 지수에 대한 어떤 힌트를 제공합니까? –
설명 결과가 업데이트되었습니다. 해당 키를 추가하고 결과가 변경되었는지 확인합니다. – fivetwentysix
또한 파생 테이블에서 선택하므로 파생 테이블을 뷰로 "이동"할 수 있습니다. 뷰에 "힌트"를 사용할 수 있어야하기 때문에 쿼리 속도를 약간 높일 수 있습니다 (MS SqlServer에서 가져온 지식이므로 MySQL에 적용되는 것이 확실하지 않습니다). –