此方法用于选择User和TargetUser之间的操作数,例如两个用户之间的操作。该方法的结果值取决于GetTotalOfPossibleActions()
返回值,该值是动态的(每个用户都有自己的编号)。
问题:将值计算从SQL转移到PHP层更好吗?
public function GetAction() {
// ...
$MaxActionCount = $this->GetTotalOfPossibleActions();
return registry::getInstance()->get('DB')->select(
'SELECT
`Action`
, `HA`.`Id` AS `ActionId`
, IF(`Count` IS NULL
, IF('.$MaxActionCount.' % 2
, IF(`HA`.`Id` = 1
, CEIL('.$MaxActionCount.' / 2)
, FLOOR('.$MaxActionCount.' / 2))
, '.$MaxActionCount.' / 2)
, GREATEST(IF('.$MaxActionCount.' % 2
, IF(`HA`.`Id` = 1
, CEIL('.$MaxActionCount.' / 2) - CONVERT(`H`.`Count`, SIGNED)
, FLOOR('.$MaxActionCount.' / 2) - CONVERT(`H`.`Count`, SIGNED))
, '.$MaxActionCount.' / 2 - `H`.`Count`), 0)
) AS `CountLeft`
FROM `Help` AS `H`
RIGHT JOIN `HelpAction` AS `HA`
ON `H`.`ActionId` = `HA`.`Id`
AND `UserId` = '.$this->UserId.'
AND `TargetUserId` = '.$this->TargetUserId.'
AND `CreatedDate` = CURDATE()'));
}
没有硬性的答案,但以下是我应用的一般指南。
PHP服务器可以实现负载平衡和倍增。因此,如果您的CPU周期很短,那么可以相对容易地添加另一个PHP服务器。相反,MySQL服务器不容易成倍增长。您可以添加复制服务器并在从属服务器上运行复杂的"选择",但复制会增加一点压力,而且在主服务器上的更新和在从属服务器中可用之间总是有延迟。(永远不要相信DB管理员说这是几毫秒;当服务器处于压力下/有备份等时,速度会变慢。)
所以+1到PHP。
然而,SQL是为使用数据进行计算而构建和设计的。这就是工作。它的效率要高得多(假设您正确地设计了表、查询和索引)。
所以+1到mySQL。
如果你在MySQL上进行计算,你也不需要将整个数据表传输到PHP来处理和处理。这节省了两者之间的网络流量。
所以+1到mySQL。
但是,如果你正在努力获得正确的查询,或者MySQL正在耗尽你所有的内存,不停地创建临时表并交换到硬盘,那么通过分解PHP中的计算来调试和发现问题会容易得多。MySQL EXPLAIN和缓慢的查询日志有时会让人沮丧。
所以+1到PHP。
所以。。。2全部。如果您在一台服务器上同时拥有这两个,并且查询不会给您带来问题,那么让MySQL来完成它的工作。如果您在查询方面遇到问题,请返回PHP。如果你在多台服务器上,那么在不达到瓶颈的情况下,尽可能多地使用MySQL。如果MySQL是一个瓶颈,无法进行复制,请重新使用PHP。但请检查网络流量。
然后记得在你的负荷增加时重新评估。。。