在PHP中扼杀与在MySQL中的内爆 - 使用更少的CPU?

时间:2011-05-10 22:50:04

标签: php mysql database casting implode

哪些选项更优化?

在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;

VS

在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);

3 个答案:

答案 0 :(得分:4)

您应该知道正确(“最佳”)选择将成为许多变量的一个因素:

  1. 您的数据库和应用程序硬件。
  2. 数据大小
  3. 数据库和应用程序服务器上的负载是什么样的。
  4. 可能影响数据集查询执行计划的索引和其他内容
  5. 实际如何使用数据。
  6. 应用服务器和数据库服务器之间的网络延迟
  7. 但你绝对可以分析程序流程来帮助你得到答案:

    在PHP中出现

    1. 执行返回所有朋友ID的选择查询
    2. 将每个ID返回给您的应用程序。
    3. 在从结果中读取字符串时在PHP中构建字符串。
    4. 优点:

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

      在MySQL中出现

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

        • 可能会在数据库服务器上为较大的数据集使用较少的内存
        • 想不出别的。只要你需要一个大的连接字符串,这个解决方案肯定是次优的。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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