2014-07-09 117 views
0

因此,我们正在构建此应用程序,其中数据的检索基于小型模块化查询。因此,对于一个产品它会是这样的:大单连接查询与多个小连接查询

$product = $this->product->getProductData($prod_id); //get main product record 
$locations = $this->locations->getAvailableLocations($prod_id); //sale locations 
$comments = $this->feedback->getFeedback($prod_id,'COMMENTS'); //user comments 

在另一方面,我们也可以这样做:$this->getAllProductData($id) 这将从根本上有一个SQL说:

get * from product_data 
left join locations on <...> 
left join comments on <...> 

programming的角度来看,第一个选项使我们更容易处理数据,混合和匹配构建单独的流程/用户体验等。我们的担心是 - 从performance的角度来看,这会成为一个问题,当产品运行数十万行时?

+0

如果你按照product_id进行过滤,并且你在每个表上都有索引,那么我认为运行3个分离的查询将会比只有一个更糟糕。但是你应该比较所有情况下的执行计划并亲自查看。在这些表上放一些测试数据并对其进行测试。 –

回答

0

每次执行SQL语句都会产生开销。发送到服务器的数据包,SQL文本解析,语句验证语句正确(关键字,逗号,parens等),语句验证语句正确(标识符引用表,列,函数等存在,用户有足够的特权,评估可能的执行计划并选择最佳方案,执行计划(获取锁,访问缓冲区中的数据等),实现结果集(元数据和值),并返回调用者,释放锁,清理资源等。在客户端,存在检索结果集,读取行和关闭语句的开销。

通常,检索实际数据时使用较少的语句会更有效,但如果该实例返回如果我们只需要20行,那么我们添加LIMIT 20在查询上。如果我们只需要特定的product_id的行,WHERE product_id = 42

当我们看到基本上相同的语句重复执行的紧密循环时,这是一个告诉传说符号,表明开发人员正在处理数据RBER(通过排成行的行),而不是作为一个集合。

底线,这取决于用例。有时候,运行一些较小的语句代替一个冗长的语句会更有效率。

0

使用你的第二个例子(所有连接在一个查询中)。只要你有一个关于“prod_id”的索引以及其他你正在过滤或加入的其他数据,数据库查询优化器就会做出明智的事情,比如看到prod_id只会返回一些记录,而这首先会做该查询的速度可能会尽可能快。在此一般情况下,查询优化器是非常非常好的

0

对于简单的连接,您可能对一个sql语句很好,但从我的经验来看,涉及更多表时,多个单独的查询对性能更好。

我曾在一个网站上产品信息分散在七个不同的表,通常只有两个或三个表需要加入。然而,在一个页面上,我们有一个复杂的搜索功能,需要查看其中的全部七个,因此在该页面上,我们编写了代码以便在一个语句中连接所有表格。它运行良好,直到几个月后,它逐渐变得越来越慢,直到它不会完全加载。

我们浏览了所有的表格,并确保所有内容都已正确索引,并且没有任何内容正在修复它。我们注意到,sql语句本身都运行良好,所以我们最终将它分解成单独的语句并修复它,不必再回头再看一遍。