Показать сообщение отдельно
Старый 05.04.2012, 19:58
Андрей911 вне форума Посмотреть профиль Отправить личное сообщение для Андрей911 Найти все сообщения от Андрей911
  № 1  
Ответить с цитированием
Андрей911
 
Аватар для Андрей911

Регистрация: Jun 2011
Сообщений: 127
По умолчанию MYSQL быстро найти наименьшее значение в таблице

Делаю в которой игроки распределены по комнатам. В комнате может быть от 2-х до 9-ти человек. При заходе нового игрока нужно его включить в комнату где минимальное количество игроков.

В БД сделал таблицу в которой записано в какой комнате сколько человек.

room (Номер комнаты) members (число членов в комнате) timestamp (Последний пинг из комнаты)

room - уникальный индекс
members - индекс

Запрос ниже не использует индекс
Код AS1/AS2:
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 ORDER BY `members` LIMIT 0,1
А эти используют.
Код AS1/AS2:
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<3 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<4 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<5 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<6 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<7 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<8 LIMIT 0,1
 
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 AND `members`<9 LIMIT 0,1
Я вот и думаю что будет быстрее использовать один запрос не использующий индекс, или несколько раз повторить запросы `members`<Х, пока один из них что-то не вернет. Или может быть есть какой-то лучший вариант?

Если не писать `rooms`>0, то индекс используется
Код AS1/AS2:
SELECT `room`,`members` FROM `rooms` ORDER BY `members` LIMIT 0,1
Но я разделил комнаты на обычные публичные (`rooms`>0) и VIP (`rooms`<0) в VIP новых игроков добавлять нельзя. Как быть?

Добавлено через 1 час 27 минут
Все проблема решена. Добавил в таблицу еще одни столбец `type`
Код AS1/AS2:
`type`=0 - обычная комната
`type`=1 - VIP комната
Запрос ниже использует индекс.
Код AS1/AS2:
SELECT `room`,`members` FROM `rooms` WHERE `type`=0 ORDER BY `members` LIMIT 0,1
Только странным остается почему индекс не используется если написать
Код AS1/AS2:
SELECT `room`,`members` FROM `rooms` WHERE `rooms`>0 ORDER BY `members` LIMIT 0,1
`rooms` вроде тоже индексированный столбец. И в чем тут дело непонятно

Добавлено через 1 час 28 минут
Да а `type`, то как раз не индексированный.


Последний раз редактировалось Андрей911; 05.04.2012 в 21:14.