Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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.
Старый 16.04.2012, 15:30
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 2  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
Я возможно не совсем понял, что за результат вы хотите получить,
но у MySql может стоит использовать конструкцию MIN(),MAX() с каким-то условием...


Последний раз редактировалось ZicoRio; 17.04.2012 в 02:19.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:17.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.