数据库
首页 > 数据库> > 在PHP中扼杀与在MySQL中的内爆 – 使用更少的CPU?

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

作者:互联网

哪些选项更优化?

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

解决方法:

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

>您的数据库和应用程序硬件.
>您的数据大小
>数据库和应用程序服务器上的负载是什么样的.
>索引和可能影响数据集上的查询执行计划的其他内容
>您实际上想要如何使用数据.
>应用服务器和数据库服务器之间的网络延迟

但是你绝对可以分析程序流程来帮助你得到答案:

在PHP中进行Imploding:

>执行返回所有朋友ID的选择查询
>将每个ID返回给您的应用程序.
>在从结果中读取字符串时,在PHP中构建字符串.

优点:

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

在MySQL中出现问题:

>执行聚合查询
>在聚合结果时构建字符串
>将一个字符串返回给您的应用程序
>输出该字符串

优点:

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

标签:php,mysql,database,casting,implode
来源: https://codeday.me/bug/20190610/1210877.html