2016-10-21 3 views
0

У меня есть база данных для рекордов лидеров игр, в настоящее время насчитывающая около 30 000 записей, а ниже запрос ищет личный лучший рекордер для определенной игры и игрока, но требуется около 60 секунд для выполнения. Я думаю, что должен быть гораздо более эффективный способ сделать это, возможно, используя составной индекс, но какой это будет?Как сделать этот личный лучший запрос MySQL 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

Я хотел бы написать запрос, используя стандартный синтаксис 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%. Довольно хорошо ;) –

Смежные вопросы