4

これらのオプションのどれがより最適ですか?

MySQLでの爆縮

$rsFriends = $cnn->Execute('SELECT CAST(GROUP_CONCAT(id_friend) AS CHAR) AS friends 
                              FROM table_friend 
                             WHERE id_user = '.q($_SESSION['id_user']));
$friends = $rsFriends->fields['friends'];
echo $friends;

対。

PHPでの爆縮

$rsFriends = $cnn->Execute('SELECT id_friend 
                              FROM table_friend 
                             WHERE id_user = '.q($_SESSION['id_user']));
while(!$rsFriends->EOF) {
    $friends[] = $rsFriends->fields['id_friend'];
    $rsFriends->MoveNext();
}
echo implode(',',$friends);
4

3 に答える 3

4

正しい(「最適な」)選択が多くの変数の要因になることをおそらく知っているはずです。

  1. データベースとアプリケーションハードウェア。
  2. データのサイズ
  3. データベースサーバーとアプリケーションサーバーの負荷はすでにどのようになっていますか。
  4. データセットのクエリ実行プランに影響を与える可能性のあるインデックスやその他のもの
  5. 実際にデータをどのように使用したいか。
  6. アプリサーバーとデータベースサーバー間のネットワーク遅延

しかし、プログラムフローを確実に分析して、答えを見つけるのに役立てることができます。

PHPでの爆縮

  1. すべての友達IDを返すselectクエリを実行します
  2. すべてのIDをアプリケーションに返します。
  3. 結果から文字列を読み取るときに、PHPで文字列を作成します。

長所:

  • 実際に必要な場合に生のIDを使用する際の柔軟性(つまり、MySQLで文字列を作成するが、PHPで後処理する場合、文字列のコンパイルでPHPをバイパスすることによるメリットは、コストのかかる後処理操作によって無効になる可能性があります。ステージ)
  • IDは、文字列ではなく数値としてアプリケーションに返される可能性があります(1234567890ASCIIは10バイト、32ビット整数は4バイト)。

MySQLでの爆縮

  1. 集計クエリを実行する
  2. 結果を集約する文字列を作成します
  3. 1つの文字列をアプリケーションに返します
  4. その文字列を出力します

長所:

  • 大規模なデータセットの場合、データベースサーバーで使用するメモリが少なくなる可能性があります
  • 他にはあまり考えられません。大きな連結文字列以外のものが必要になるとすぐに、このソリューションは間違いなく最適ではありません。
于 2011-05-10T23:02:51.833 に答える
3

コメントによると、最適はコンテキストに大きく依存します。そうは言っても、私の哲学は、データベースがそれを実行できるのであれば、それを許可することです。

特にあなたの場合、結果を分析または操作しない場合(つまり、これは厳密にすべてのレコードを結合して出力することです)、私は間違いなくデータベースに投票します。

于 2011-05-10T22:58:36.953 に答える
1

ここでおそらく最も最適化する価値があるのは、実装と保守のための開発者の時間と労力です。CPUサイクルの違い(実行されている作業全体の割合として)は、おそらく些細なことです。作成、テスト、サポートが最も簡単な方法で行うことをお勧めします。

于 2011-05-10T23:07:26.283 に答える