SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.11.2009 08:07:41

udaaff
Участник
Зарегистрирован: 24.11.2009
Сообщений: 6

Создание БД для таблицы рекордов. Вывод ТОП 10 + рейтинг текущего юзера.

Здравствуйте.
Если тема уже поднималась, то извините, не нашел ответа.
Существует приложение, которое крутится на стороннем сервере, допустим игра. Пользователи авторизуются на том же сервере, у каждого пользователя, есть свое уникальное id (к примеру, целое от 0 до 10000000). Я хочу сохранять максимальное количество баллов, набранное пользователем, в своей БД. Для этого я создал таблицу:

CREATE TABLE IF NOT EXISTS `TestYourSpeed_records` (
  `viewer_id` int(11) NOT NULL,
  `speed` int(11) NOT NULL,
  PRIMARY KEY  (`viewer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


В которую соотв. заносится id пользователя, если не существует, и записывается или обновляется (если больше предыдущего) результат (speed). Записей теоретически может быть более миллиона. Значения в колонке speed не уникальны и могут совпадать, поэтому я решил считать значение текущего пользователя, более весомым чем остальных с таким же результатом и выводить его первее, результаты т.о. у разных юзеров могут не совпадать, что плохо.
Теперь мне необходимо сделать выборку "топ 10" из БД. Решил ее делать без учета текущего пользоваля:

SELECT * FROM TestYourSpeed_records WHERE viewer_id != $viewer_id ORDER BY speed DESC LIMIT 10;


Рейтинг текущего юзера нахожу след. образом:

SELECT COUNT(*) AS count FROM TestYourSpeed_records
                    WHERE speed > (SELECT speed FROM TestYourSpeed_records WHERE viewer_id = $viewer_id)


Далее уже можно вывести топ с учетом этого рейтинга.
Что-то мне подсказывает, что это не оптимальное решение вопроса.
Может быть лучше пересортировывать таблицу, при внесении изменений, т.е., чтобы значения скорости были упорядочены в самой таблице от большего к меньшему? (Может это как-то автоматизировать можно?) Возможно нужно саму БД спроектировать по другому.. Не представляю, правда, каким образом это сделать. В общем, не хватает знаний для правильного решения этого вопроса. Кто что думает по этому поводу, какие идеи?
Подмогните, кто чем сможет... .

Отредактированно udaaff (24.11.2009 09:18:38)

Неактивен

 

#2 24.11.2009 13:33:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создание БД для таблицы рекордов. Вывод ТОП 10 + рейтинг текущего юзера.

1. В любом случае нужен индекс на speed, т.к. Вы по ней сортируете.
2. Для небольшого количества запросов хватит и Вашей схемы. Для
высоконагруженного сервиса обычно обновляют статистику раз в
сколько-то времени (например, раз в час), переписывая «места» для
всех пользователей в таблице.

Неактивен

 

#3 24.11.2009 14:21:02

udaaff
Участник
Зарегистрирован: 24.11.2009
Сообщений: 6

Re: Создание БД для таблицы рекордов. Вывод ТОП 10 + рейтинг текущего юзера.

Спасибо за разъяснение.
Добавил индекс след. образом:

ALTER TABLE `TestYourSpeed_records` ADD INDEX i_speed( speed ) ;

Насколько я понял это должно ускорить процесс сортировки? Надо почитать про индексы более подробно...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson