1

此方法用于选择用户和目标用户之间的操作数,例如仅在两个用户之间。此方法的结果值取决于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()'));

}
4

1 回答 1

2

没有硬性和快速的答案,但以下是我应用的一般指南。

PHP 服务器可以负载平衡和倍增。因此,如果您的 CPU 周期不足,您可以相对轻松地添加另一个 PHP 服务器。反之,MySQL 服务器也不能轻易成倍增加。您可以添加复制服务器并在从属服务器上运行复杂的“选择”,但复制会增加一点压力,并且在主服务器上的更新与从服务器上可用之间总是存在延迟。(永远不要相信说它是毫秒的数据库管理员;当服务器处于压力之下/有备份等时它会变慢。)

所以 +1 给 PHP。

但是,SQL 的构建和设计目的是对数据进行计算。这就是它的工作。它的效率要高得多(假设您正确设计了表、查询和索引)。

所以 +1 到 mySQL。

如果在 MySQL 上进行计算,也不需要将整个数据表转给 PHP 进行处理和处理。这节省了两者之间的网络流量。

所以 +1 到 mySQL。

但是,如果您正在努力获取正确的查询,或者 MySQL 正在耗尽所有内存,不停地创建临时表并交换到硬盘,那么通过分解 PHP 中的计算来调试和发现问题要容易得多. MySQL EXPLAIN 和慢查询日志有时令人沮丧。

所以 +1 给 PHP。

所以... 2个。如果您在一台服务器上同时拥有两者,并且查询没有给您带来问题,那么让 MySQL 来完成它的工作。如果您遇到查询问题,请退回到 PHP。如果您在多台服务器上,请尽可能多地使用 MySQL,而不会遇到瓶颈。如果 MySQL 是瓶颈并且无法复制,请退回到 PHP。但随后检查网络流量。

然后记得在你的负载增加时重新评估......

于 2012-08-23T06:50:56.133 回答