Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-每次迭代查询单个值,还是在开始时获取所有值并从数组中检索?_Php_Database_Performance - Fatal编程技术网

PHP-每次迭代查询单个值,还是在开始时获取所有值并从数组中检索?

PHP-每次迭代查询单个值,还是在开始时获取所有值并从数组中检索?,php,database,performance,Php,Database,Performance,我有一个函数,看起来像这样: //iteration over scales foreach ($surveyScales as $scale) { $surveyItems = $scale->findDependentRowset('SurveyItems'); //nested iteration over items in scale foreach ($surveyItems as $item) { //retrieve a si

我有一个函数,看起来像这样:

//iteration over scales
foreach ($surveyScales as $scale)
{
    $surveyItems = $scale->findDependentRowset('SurveyItems');

    //nested iteration over items in scale
    foreach ($surveyItems as $item)
    {
        //retrieve a single value from a result table and do some stuff
        //depending on certain params from $item / $scale
    }
}

问题:对内部foreach中的每个值执行db查询更好,还是将所有结果值提取到一个数组中并从中获取值更好?

一个返回十几条数据的查询比12个返回一条数据的查询快12倍

哦,永远不要把SQL放在循环中,它总会导致灾难

根据应用程序的工作方式,可能会为每个查询打开一个新连接,这尤其糟糕,因为每个DB服务器对连接数都有限制。然后还要意识到这会发生在每个用户身上,所以有5个用户的50个查询,而在任何给定时刻,您已经有250个查询了。但是,即使所有查询都只共享一个连接,您也会使DB服务器负担增加X倍,使其他所有内容、每个页面的速度都变慢,因为用户占用了该页面上的DB服务器,每个人都必须共享


我曾经看到过一个完整的应用程序因为这个1设计缺陷而失败,只是不要这样做。

肯定是从数组中获取所有数据和检索数据。

我同意其他人的观点——我是在Zend框架中设计和编码您正在使用的表关系API的人

如果您已经有对父行的引用,并且可能需要获取相关行,那么
findDependentRowset()
非常有用。与连接两个表的查询相比,此函数的效率最低。如果性能是最重要的,那么您永远不应该在循环中调用
findDependentRowset()
。相反,编写一个包含两个表的联接的SQL查询

令人遗憾的是,回顾过去,Zend的框架目标是设计的简单性,而不是性能

如果我继续在Zend工作,我会尝试用一种方便的方法来改进表接口,对相关的Zend_Db_表对象执行联接查询。我离开项目后实现的解决方案是构建一个Select对象并将其传递给
fetchAll()
,这非常难看


编辑:作为对您评论的回复,我尽了最大努力,根据一组需求创建了一个解决方案。我对我所做的感到很好。但Zend是一家IDE工具公司,因此它们的价值自然在于编码的便利性,而不是运行时性能。“快速应用程序开发”可以指快速开发应用程序,也可以指快速开发应用程序。对于一家工具公司来说,这意味着后者。

我想说,检索x行的查询比检索1行的x个查询快x倍以上。行数越多,差异就越大。如果你能详细说明一下差异部分,答案可能会被接受。非常感谢。详细说明他的意思:你将分别访问数据库12次。这(至少)是一打PHP函数调用,可能是通过网络到DB服务器的12次往返,12次服务器必须解析查询并构建执行计划,…是的,性能噩梦随着循环次数的增加而成倍恶化。您可能不会注意到它有10行或20行,但它会随着行数的增加而呈指数级地变慢,这是假设它不会开始与缓存大小限制之类的事情交互……您在批评自己的工作:)您现在不喜欢Zend Framework,还是只是这个您觉得难看的问题?我这么问是因为听起来你对采埃孚很了解,如果有人知道它,根本不喜欢它。。。RAD并不意味着应用程序执行得很快,它总是意味着你可以用更少的努力来创建应用程序。