2015-09-15 4 views
0

Как эффективно хранить рекорды в базе данных?Хранение рекордов в базе данных эффективно

У меня есть таблица player_score с двумя столбцами player_id (первичный ключ), оценка (целочисленное значение).

Теперь я хочу позицию игрока в топ-лист и я создал следующий запрос

SELECT player_score.player_id, 
    (SELECT COUNT(*) FROM player_score ps WHERE ps.score >= player_score.score) AS position 
FROM player_score  
WHERE player_score.player_id = 19 

Я думаю, что это очень нерационально у вас какие-либо другие идеи? Также возможно использовать elasticsearch или любую другую технологию для эффективного хранения этих данных.

+0

Я думаю, что это нормально. Вместо COUNT (*) вы можете изменить значение COUNT (id). Добавить индекс в поле оценки –

+0

Мой тест с 1 Mio записей имел время работы 240 мс на локальной машине. Я думаю, все в порядке. Я буду хранить значения в memcache, чтобы получить больше производительности. Спасибо за вашу помощь. – Pascal

ответ

0

Вы можете использовать следующий запрос, чтобы получить точное положение пользователя в списке высоких баллов:

SELECT COUNT(*)+1 AS pos 
FROM (SELECT * 
     FROM player_score 
     ORDER BY score DESC) AS ordered_scores, player_score 
WHERE player_score.player_id=3 AND player_score.score < ordered_scores.score; 
Смежные вопросы