forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PHP / MySQL (http://forum.boolean.name/forumdisplay.php?f=135)
-   -   Порядок выполнения в Update (http://forum.boolean.name/showthread.php?t=19258)

pax 18.06.2014 14:48

Порядок выполнения в Update
 
Допустим есть такой запрос:

UPDATE table_name SET avg = avg * count/(count + 1) + :newValue / (count + 1), count = count + 1 WHERE id = :id

Сработает ли такой запрос правильно или он может сначала посчитать count, а потом avg? Если он срабатывает правильно, то похоже у меня накапливается ошибка вычислений с вещественными числами в среднем значении...

moka 18.06.2014 15:19

Ответ: Порядок выполнения в Update
 
Сделал тест, SET выполняются по очереди (слева на право).
Странная у тебя там формула Average. Но ты можешь использовать ROUND(X, D) где D - степень точности для округления, например если D=2, то ROUND(0.0165, 2) == 0.02

А вообще лучше избегать любые "накопительные" операции с float числами где только возможно. Лучше пересчитать, чем накапливать.

pax 18.06.2014 15:29

Ответ: Порядок выполнения в Update
 
А есть другие варианты?

Я не храню инфу о всех элементах последовательности для среднего, поэтому исходя из текущего среднего и количества элементов мне надо получить новое добавляя новый элемент.

UPD: вероятно есть вариант использовать N последних чисел в последовательности. Например если N = 100, то будет примерно так:

UPDATE table_name SET avg = avg * (99/100) + :newValue / 100 WHERE id = :id

И не хранить count в таблице...

moka 18.06.2014 16:37

Ответ: Порядок выполнения в Update
 
А сколько примерно будет записей для просчета общего? 10, 100, 1000?
Т.к. в SQL есть SUM, делать это каждый раз - может быть тяжеловато если слишком много записей, или если эта query часто выполняется.

pax 18.06.2014 17:58

Ответ: Порядок выполнения в Update
 
Фактически это среднее время трассы, т.е. каждый финиш игроков на трассе будет фиксироваться. Я думаю будет не мене десятков тысяч

HolyDel 18.06.2014 18:21

Ответ: Порядок выполнения в Update
 
если каждое время фиксируется в базе, то не проще ли сначала посчитать сумму этого времени, а потом поделить ее на число записей в базе?

moka 18.06.2014 18:25

Ответ: Порядок выполнения в Update
 
HolyDel именно. Тем более статистика "сколько времени откатался" тоже приятная, и всего-то поделить на число раундов, и вот вам среднее.

pax 18.06.2014 18:54

Ответ: Порядок выполнения в Update
 
Я наверное не так выразился, каждое время в плане среднего времени, если сохранять в базе все финиши игроков на трассах, та это просто ппц объемы будут.
К примеру 10 игроков, до финиша можно доехать за 30 секунд, заезд 20 минут. Т.е. в худшем случае на 10 игроков за заезд будет 400 финишей. И это только одна игра. А если будет одновременно играть несколько тысяч игроков (сотни заездов)?

Сейчас я сохраняю лучшее время игрока на трассе и лучшее время трассы. Нужно среднее время трассы для расчета бонусов и рейтинга.

Если хранить сумму всего времени и число финишей, то я не знаю на сколько большое число может получиться... я храню время целым числом в сотых долях секунды. 10 секунд это 1000 в бд.

moka 18.06.2014 20:52

Ответ: Порядок выполнения в Update
 
В UNSIGNED BIGINT вмещается 18446744073709551615 ужасно много (599,730,287,456 лет), так что не беспокойся, вместится.

HolyDel 18.06.2014 21:42

Ответ: Порядок выполнения в Update
 
вопще давать бонусы за среднее время карты, которое рассчитывается динамически от действий игроков, имхо, некорректно.

у тебя появятся 100500 твинков, которые будут спецом ехать медленно, чтобы мейны поулчали бонусы за проезд. тебе это надо? проедь трассу сам с рядом знакомых, посмотри ее время - оно пусть и будет бонусным.
если увидишь что бонусы падают слишком часто - уменьшаешь время на 3 секунды, слишком редко - увеличиваешь.

SBJoker 18.06.2014 21:58

Ответ: Порядок выполнения в Update
 
а лучше бонус если время лучше чем у 95% игроков (или другой процент)

moka 18.06.2014 22:01

Ответ: Порядок выполнения в Update
 
Угу, бонус от статистического. Таким образом все могут получить бонус за хорошую езду, и будет честно - только лучшие.
Естественно нужен также бонус за 1/2/3 место, но это другое.

pax 19.06.2014 01:02

Ответ: Порядок выполнения в Update
 
Уговорили, сделаю сумму времени в int64, а по поводу подсчета бонусов еще не решено все. Мне сейчас нужны данные, которые я смогу как-то использовать потом. Баланс довольно сложно придумать в заездах, где будут участвовать разные машины (по скорости и управляемости). Возможно все еще не один раз поменяется...


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot