Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 06.02.2013, 03:36   #16
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

Да мне так и надо. Теперь я думаю что мне надо искать по параметрам тоже... Т.е. получить список пользователей отфильтрованный по какому либо параметру и отсортированный по значению параметра - таблица рекордов например. Пока появилась мысль дублировать поле parameter и добавить ему индекс, а для сортировки тоже нужен индекс для значения параметра?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 10:52   #17
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Добавить запись если не существует.

По сути не нужны индексы для сортировки.
Единственная разница в том что если ты будешь делать запросы к данным, заместо прямого доступа по индексу, бд будет листать все данные логически отфильтровывая.
Следственно, тут если нужна хорошая скорость, либо использовать индексы (но и они не всегда спасают), либо завезти отдельную таблицу которая будет обновляться в бд периодически, и выдавать её - получается кеш. Это самый шустрый вариант.

Просто когда речь будет идти о десятках тысяч игроков, то не индексированный поиск и сортировка не будет быстрой затеей.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (06.02.2013)
Старый 06.02.2013, 11:13   #18
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

Отдельная таблица - хорошо, сделаю раз N минут обновление. Но индексы я создам. Создал индекс на поле parameter. Первый раз почему-то ругалось. Теперь норм)
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 11:29   #19
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

Еще интересно, такие запросы это очень плохо?
SELECT FROM `user_params
WHERE user 49 AND parameter 
      (
SELECT id FROM parameters WHERE name 'frags' LIMIT 1
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 15:32   #20
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Добавить запись если не существует.

Это называется Subquery, и если он находится во внешней части запроса (WHERE), то это будет произведено один раз перед главным запросом, и затем будет использовано.
А вот если ты сделаешь подобное до FROM - для значения, то такой Subquery будет запущен для каждой строки которая будет выведена (учитывая возможный LIMIT).

По сути это ок.
Вопрос, у тебя как понимаю параметр это не только имя, и id, а что-то ещё, типо тип значения, минимальное / максимальное значение? Если это всё же что-то простое, то я не вижу необходимости иметь отдельную таблицу. Если же сложное - то оправдано.
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 16:20   #21
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

Я тут возможно подумаю о преобразовании поля parameter в тип enum, чтобы не получать id параметров из другой таблицы по имени. Сейчас таблица parameters просто список параметров с их id.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 18:39   #22
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Добавить запись если не существует.

Сообщение от pax Посмотреть сообщение
Я тут возможно подумаю о преобразовании поля parameter в тип enum, чтобы не получать id параметров из другой таблицы по имени. Сейчас таблица parameters просто список параметров с их id.
А почему тебе просто не использовать в таблице user_params в поле param сразу имя параметра типо: armor, health, speed и т.п.?
Они индексируются хорошо, и поиск нормально по ним тоже если индексированы.
Тем самым и читаемы, и одна таблица заместо двух.
(Offline)
 
Ответить с цитированием
Старый 07.02.2013, 03:14   #23
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

да хотел не тратить лишней памяти
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 07.02.2013, 04:36   #24
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,133
Написано 2,326 полезных сообщений
(для 6,469 пользователей)
Ответ: Добавить запись если не существует.

Кстати при таком подходе и производительность будет выше, а затрачиваемой памяти будет куда меньше.
Хотя главное тут не память, а количество обращений к файловой системе.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (07.02.2013)
Старый 08.02.2013, 03:50   #25
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

В общем решил отказаться от Enum вот почему:
http://www.mysqlperformanceblog.com/...hat-is-faster/
The problem we had with ENUM-fields; When we wanted to add a ‘type’ to an ENUM-field (or change the definition of the field in any way), MySQL often did a complete rewrite of that table. For some of our bigger tables (think tens of millions of records), this could take up to a few hours sometimes, which meant downtime. So for a few cases we decided to switch from ENUM’s to TINYINT’s because this eliminates the need for a change in table definition.
и пришел к выводу что лучше сделать в php вот так:
$config = array(
        ...,
        
'user_params' => array(
            
'frags' => 1,
            
'deaths' => 2,
            
'wins' => 3,
            
'fails' => 4,
            
'xp' => 5,
            
'money' => 6,
            
'golds' => 7
        
),
       ); 
и поле объявить как tinyint
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 08.02.2013 в 06:24.
(Offline)
 
Ответить с цитированием
Старый 08.02.2013, 07:20   #26
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,133
Написано 2,326 полезных сообщений
(для 6,469 пользователей)
Ответ: Добавить запись если не существует.

Сообщение от pax Посмотреть сообщение
$config = array(
        ...,
        
'user_params' => array(
            
'frags' => 1,
            
'deaths' => 2,
            
'wins' => 3,
            
'fails' => 4,
            
'xp' => 5,
            
'money' => 6,
            
'golds' => 7
        
),
       ); 
O__o
Если я правильно понял это константы.
<?
class UserParams{
     const 
FRAGS 1;
     const 
DEATHS 2;
     const 
WINS 3;
}
// ну и юзать так
UserParams::MONEY
?>
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 16Gb ram; Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 08.02.2013, 09:09   #27
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,502
Написано 2,957 полезных сообщений
(для 5,222 пользователей)
Ответ: Добавить запись если не существует.

чтобы понятнее было чего я хочу добиться:

$config = array(
...
    
'user_params' => array(
        
'frags' => 1,
        
'deaths' => 2,
        
'wins' => 3,
        
'fails' => 4,
        
'xp' => 5,
        
'money' => 6,
        
'golds' => 7
    
),
    
'user_params_invert' => array(
        
=> 'frags',
        
=> 'deaths',
        
=> 'wins',
        
=> 'fails',
        
=> 'xp',
        
=> 'money',
        
=> 'golds'
    
),
); 
public function user_updateParameter($id$parameterName$value)
    {
        
$param $this->config['user_params'][$parameterName];
        if (isset(
$param)) {
            
$sth $this->dbh->prepare('INSERT INTO user_params (user, parameter, value) VALUES (:user, :parameter, :value1) ON DUPLICATE KEY UPDATE  value = value + :value2');
            
$sth->execute(array(
                
':user' => intval($id),
                
':parameter' => $param,
                
':value1' => intval($value),
                
':value2' => intval($value)
            ));
        }
    } 
public function user_getParameters($id)
    {
        
$sth $this->dbh->prepare('SELECT parameter, value FROM user_params WHERE user = ?');
        
$sth->execute(array(intval($id)));
        
$params $sth->fetchAll(PDO::FETCH_NUM);
        
$nameValue = array();
        
$pi = &$this->config['user_params_invert'];
        foreach (
$params as $keyValue) {
            
$nameValue[$pi[$keyValue[0]]] = $keyValue[1];
        }
        return 
$nameValue;
    } 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 12:34.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com