我正在开发游戏,我希望每分钟运行一个脚本(在cron作业的帮助下,我猜)。
因此,我想要运行的脚本获取字符的最大HP(来自数据库表中的列),计算得到该值的10%,然后将这10%添加到当前hp的字符(这是表中的另一栏)。然后我想在数据库表中的所有行上进行迭代。
E.g。请考虑下表:
charname current_hp max_hp
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
player1 20 30
player2 15 64
player3 38 38
运行脚本后,我希望表格如下所示:
charname current_hp max_hp
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
player1 23 30
player2 21 64
player3 38 38
所以,我知道我在技术上如何实现这一点,例如
$characters = $db->getCharacterList();
foreach ($characters as $character) {
$maxHp = $character['max_hp'];
$curHp = $character['current_hp'];
$hpToAdd = $maxHp / 10;
if (($curHp + $hpToAdd) >= $maxHp) {
$db->update('characters', $character['id'], array(
'current_hp' => $maxHp
));
} else {
$db->update('characters', $character['id'], array(
'current_hp' => ($curHp + $hpToAdd)
));
}
}
我唯一的问题是:上面的解决方案是否有效实施此方法?这会在10 000行的桌子上工作,还是花费太长时间?
提前致谢。
答案 0 :(得分:0)
In One SQL语句将满足您对更高性能的所有要求,删除此表上的任何索引以保持其快速
UPDATE test
SET current_hp= CASE
WHEN ((max_hp/10)+current_hp) >=max_hp THEN max_hp
ELSE ((max_hp/10)+current_hp)
END
答案 1 :(得分:0)
您使用的是SQL数据库吗?如果您有10,000行,那么您的解决方案将在数据库中运行10,000次。像这样的SQL语句只会使一个数据库命中:
UPDATE characters
SET current_hp = LEAST(max_hp, current_hp + (max_hp / 10))
数据库仍然需要执行更新所有10,000行所需的I / O,但它将比数千个单独查询更有效。