|
PHP / MySQL Создание динамических Веб-ресурсов |
06.02.2013, 07:36
|
#16
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Да мне так и надо. Теперь я думаю что мне надо искать по параметрам тоже... Т.е. получить список пользователей отфильтрованный по какому либо параметру и отсортированный по значению параметра - таблица рекордов например. Пока появилась мысль дублировать поле parameter и добавить ему индекс, а для сортировки тоже нужен индекс для значения параметра?
|
(Offline)
|
|
06.02.2013, 14:52
|
#17
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
По сути не нужны индексы для сортировки.
Единственная разница в том что если ты будешь делать запросы к данным, заместо прямого доступа по индексу, бд будет листать все данные логически отфильтровывая.
Следственно, тут если нужна хорошая скорость, либо использовать индексы (но и они не всегда спасают), либо завезти отдельную таблицу которая будет обновляться в бд периодически, и выдавать её - получается кеш. Это самый шустрый вариант.
Просто когда речь будет идти о десятках тысяч игроков, то не индексированный поиск и сортировка не будет быстрой затеей.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2013, 15:13
|
#18
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Отдельная таблица - хорошо, сделаю раз N минут обновление. Но индексы я создам. Создал индекс на поле parameter. Первый раз почему-то ругалось. Теперь норм)
|
(Offline)
|
|
06.02.2013, 15:29
|
#19
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Еще интересно, такие запросы это очень плохо?
SELECT * FROM `user_params` WHERE user = 49 AND parameter = (SELECT id FROM parameters WHERE name = 'frags' LIMIT 1)
|
(Offline)
|
|
06.02.2013, 19:32
|
#20
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Это называется Subquery, и если он находится во внешней части запроса (WHERE), то это будет произведено один раз перед главным запросом, и затем будет использовано.
А вот если ты сделаешь подобное до FROM - для значения, то такой Subquery будет запущен для каждой строки которая будет выведена (учитывая возможный LIMIT).
По сути это ок.
Вопрос, у тебя как понимаю параметр это не только имя, и id, а что-то ещё, типо тип значения, минимальное / максимальное значение? Если это всё же что-то простое, то я не вижу необходимости иметь отдельную таблицу. Если же сложное - то оправдано.
|
(Offline)
|
|
06.02.2013, 20:20
|
#21
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Я тут возможно подумаю о преобразовании поля parameter в тип enum, чтобы не получать id параметров из другой таблицы по имени. Сейчас таблица parameters просто список параметров с их id.
|
(Offline)
|
|
06.02.2013, 22:39
|
#22
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Сообщение от pax
Я тут возможно подумаю о преобразовании поля parameter в тип enum, чтобы не получать id параметров из другой таблицы по имени. Сейчас таблица parameters просто список параметров с их id.
|
А почему тебе просто не использовать в таблице user_params в поле param сразу имя параметра типо: armor, health, speed и т.п.?
Они индексируются хорошо, и поиск нормально по ним тоже если индексированы.
Тем самым и читаемы, и одна таблица заместо двух.
|
(Offline)
|
|
07.02.2013, 07:14
|
#23
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
да хотел не тратить лишней памяти
|
(Offline)
|
|
07.02.2013, 08:36
|
#24
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,359
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Добавить запись если не существует.
Кстати при таком подходе и производительность будет выше, а затрачиваемой памяти будет куда меньше.
Хотя главное тут не память, а количество обращений к файловой системе.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.02.2013, 07:50
|
#25
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
В общем решил отказаться от 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
Последний раз редактировалось pax, 08.02.2013 в 10:24.
|
(Offline)
|
|
08.02.2013, 11:20
|
#26
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,359
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Добавить запись если не существует.
Сообщение от 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? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
08.02.2013, 13:09
|
#27
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
чтобы понятнее было чего я хочу добиться:
$config = array( ... 'user_params' => array( 'frags' => 1, 'deaths' => 2, 'wins' => 3, 'fails' => 4, 'xp' => 5, 'money' => 6, 'golds' => 7 ), 'user_params_invert' => array( 1 => 'frags', 2 => 'deaths', 3 => 'wins', 4 => 'fails', 5 => 'xp', 6 => 'money', 7 => '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; }
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:34.
|