Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   MYSQL быстро найти наименьшее значение в таблице (http://www.flasher.ru/forum/showthread.php?t=177669)

Андрей911 05.04.2012 19:58

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`, то как раз не индексированный.

ZicoRio 16.04.2012 15:30

Я возможно не совсем понял, что за результат вы хотите получить,
но у MySql может стоит использовать конструкцию MIN(),MAX() с каким-то условием...


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

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