1

この方法は、UserとTargetUserの間、たとえば2人のユーザーの間だけでアクションの数を選択することです。このメソッドの結果値は、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サーバーは簡単に増やせません。レプリケーション サーバーを追加し、スレーブ サーバーで複雑な「選択」を実行できますが、レプリケーションは少しストレスを加え、マスターでの更新とスレーブでの利用可能との間には常に遅延が生じます。(ミリ秒だと言うDB管理者を決して信じないでください。サーバーに負荷がかかっているときやバックアップなどで遅くなります。)

したがって、PHPに+1します。

ただし、SQL は、データを使用して計算を行うように構築および設計されています。それが仕事です。それははるかに効率的です (テーブル、クエリ、およびインデックスを正しく設計すると仮定します)。

したがって、mySQL に +1 します。

MySQL で計算を行う場合、データ テーブル全体を PHP に転送して処理および処理する必要もありません。これにより、2 つの間のネットワーク トラフィックが節約されます。

したがって、mySQL に +1 します。

しかし、クエリを正しく行うのに苦労している場合、または MySQL がすべてのメモリを使い果たし、一時テーブルの作成とハードディスクへのスワッピングが止まらない場合は、PHP で計算を分解することにより、デバッグして問題を見つけるのがはるかに簡単になります。 . MySQL EXPLAIN と遅いクエリ ログは、解読するのにイライラすることがあります。

したがって、PHPに+1します。

だから... 2 全部。1 つのサーバーに両方があり、クエリで問題が発生しない場合は、MySQL に任せてください。クエリに問題がある場合は、PHP に戻ります。複数のサーバーを使用している場合は、ボトルネックに達することなく、できる限り多くのことを MySQL で実行してください。MySQL がボトルネックでレプリケーションが不可能な場合は、PHP に戻ります。ただし、ネットワークトラフィックを確認してください。

次に、負荷が増加したときに再評価することを忘れないでください...

于 2012-08-23T06:50:56.133 に答える