当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PHP-每次迭代查询单个值或在开始时获取所有值并从数组中检索?》经验,为你挑选了2个好方法。

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

//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查询是否更好?或者将所有结果值提取到数组并从中获取值更好?



1> TravisO..:

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

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

根据应用程序的工作方式,可能会为每个查询打开一个新连接,这尤其糟糕,因为每个数据库服务器都有一个连接数限制.然后还会意识到这将发生在每个用户身上,因此50个查询有5个用户,并且您在任何给定时刻已经有250个查询.但是,即使所有查询只共享一个连接,你也会对数据库服务器征税X倍,对其他所有页面都减慢速度,因为用户正在占用这个页面上的数据库服务器,并且每个人都必须共享.

我已经看到过去整个应用程序都因为这个设计缺陷而失败,只是不要这样做.



2> Bill Karwin..:

我同意其他人 - 我是那个在你正在使用的Zend Framework中设计和编码表关系API的人!

findDependentRowset()如果您已经有对父行的引用,并且可能需要获取相关行,则此选项很有用.与连接两个表的查询相比,此函数至少效率不高.findDependentRowset()如果性能是优先考虑的话,你不应该在循环中调用.而是编写一个由两个表的JOIN组成的SQL查询.

回想起Zend的框架目标是设计简单而不是性能,这是不幸的.

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

编辑: 在回复您的评论时,我尽力根据一系列要求创建解决方案.我对自己的所作所为感到满意.但Zend是一家IDE工具公司,因此它们的价值很大程度上是为了方便编码,而不是运行时性能."快速应用程序开发"可能意味着开发快速应用程序,或快速开发应用程序.对于工具公司来说,它意味着后者.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有