在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