2016-10-21 1 views
0

현재 게임 리더 보드 최고 기록을위한 데이터베이스가 약 30.000 개의 항목을 가지고 있으며, 아래 쿼리는 특정 게임 및 플레이어에 대한 개인 최고 기록을 찾습니다. 그러나 실행하려면 60 초이 필요합니다. 나는 복합 인덱스를 사용하는 것이 훨씬 더 효율적인 방법이라고 생각하고있다.하지만 어느 것이 될 것인가?어떻게이 개인 최고의 최고급 MySQL 쿼리를보다 효율적으로 만들 수 있습니까?

SELECT name, score, date, version, mode, attempts, time, id 
FROM highscore h1 
WHERE score = (
    SELECT MAX(score) 
    FROM highscore h2 
    WHERE name = h1.name && gamename = "asteroids" && name = "bob" 
) 

나는 현재에 대한 인덱스가 :

id 
score 
name 
name-gamename (composite) 

어떤 도움을 크게 감사합니다!

답변

2

I 표준 SQL 구문을 사용하여 쿼리를 작성합니다이를 위해

SELECT name, score, date, version, mode, attempts, time, id 
FROM highscore h1 
WHERE score = (SELECT MAX(score) 
       FROM highscore h2 
       WHERE h2.name = h1.name AND h2.gamename = 'asteroids' AND h2.name = 'bob' 
      ); 

을, 당신은 복합 인덱스를 원하는 : highscore(name, gamename, score). 당신은 단지 행 (관계가있는 경우에도)을 찾는 경우

, 다음이 조금이라도 더 빠를 수 있습니다

SELECT name, score, date, version, mode, attempts, time, id 
FROM highscore h 
WHERE h.gamename = 'asteroids' AND h.name = 'bob' 
ORDER BY score DESC 
LIMIT 1; 

적절한 지수는 highscore(name, gamename, score)입니다.

+0

감사합니다. 완벽하게 작동합니다. 참고로, 내 구체적인 예에서 새로운 복합 색인을 사용한 제안은 0.0290 초와 0.0172 초가 소요되었습니다. 이 경우에는 하나의 행만 필요하기 때문에 두 번째 것은 저에게 완벽합니다. 감사! – jsmars

+0

60 초에서 0.0172 초까지. . . 그것은 99.97 %의 개선입니다. 꽤 좋은;) –

관련 문제