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 的选择查询
  2. 将每个 ID 返回到您的应用程序。
  3. 从结果中读取字符串时,在 PHP 中构建字符串。

优点:

  • 如果您确实需要它们,可以灵活使用原始 ID(这意味着 - 如果您在 MySQL 中创建字符串,但在 PHP 中对其进行后处理,那么昂贵的后处理操作可能会抵消在字符串编译中绕过 PHP 所带来的好处阶段)
  • ID 可以(是?)作为数字而不是字符串返回到您的应用程序(1234567890是 10 个字节的 ASCII,4 个字节作为 32 位整数)

在 MySQL 中内爆

  1. 执行聚合查询
  2. 在聚合结果时构建一个字符串
  3. 将一个字符串返回到您的应用程序
  4. 输出那个字符串

优点:

  • 对于大型数据集,可能会在数据库服务器上使用更少的内存
  • 想不到其他的了。只要您需要除了大的连接字符串之外的任何东西,这个解决方案绝对不是最佳的。
于 2011-05-10T23:02:51.833 回答
3

根据评论,最佳在很大程度上取决于上下文。话虽如此,我的理念是:如果数据库可以做到,那就让它去做。

特别是针对您的情况,如果您不分析或操纵结果-这意味着严格将所有记录连接在一起以进行输出-那么我肯定会投票给数据库。

于 2011-05-10T22:58:36.953 回答
1

这里最值得优化的可能是开发人员的时间和精力,用于实施和维护。CPU 周期的差异(作为正在完成的总工作的一部分)很可能是微不足道的。我建议您以最容易编写、测试和支持的方式进行。

于 2011-05-10T23:07:26.283 回答