繁体   English   中英

MySQL + PHP:查询的每一行都有新查询?

[英]MySQL + php: new query for each row of a query?

这是一个我经常出现的话题。 对于返回行列表的查询类型,我们通常希望执行进一步的查询,以收集有关该特定行的更多信息,这通常包括本身返回行列表的查询。 一个示例是订单系统,该系统返回客户列表,每个客户的“行”也可能显示他们的订单列表(也许在弹出对话框中)。

通常是否“更好”于:

  1. 在可能的情况下使用GROUP_CONCAT执行一个查询,然后以编程方式将结果分开(返回的串联长度受到限制)
  2. 循环浏览“父查询”的结果时,对每一行执行“子查询”
  3. 使用SQL IN关键字执行一个“父查询”以返回客户列表,并执行一个“订单”查询以匹配从上一个查询返回的customer_ID。 遍历客户查询的结果,我们可以查看订单查询中是否存在customer_ID并显示匹配的订单。
  4. 按时间执行第二个查询。 原因是我们并不总是希望看到每个父结果的子结果(使用网络应用程序,我们可以使用AJAX来获取子结果)
  5. 还有吗

我一直倾向于#2,因为从概念上讲,这似乎是最干净的解决方案,但我不禁认为这是一种资源浪费。 为特定的一组结果制定自己的基准,#3最快出现。 #4似乎应该是最快的,因为某些应用程序不需要显示所有结果,但是,其目的可能是准备好结果并等待,而不是另一回程来检索该行的子数据。 我不确定FETCH_ASSOC等机制的工作原理,但是任何建议都非常欢迎!

我认为#3更好。 我建议先获取所有客户,然后再获取此客户的所有订单的列表(customer_ID IN(...)),然后根据需要将订单分派给php端的正确客户。

这样,您将只获得两个查询所有信息,并且可以避免调度部分(取决于此查询后执行的逻辑)。

请记住,查询的大部分开销都来自查询本身(传输查询,然后取回数据)数据库针对搜索和联接等进行了优化优化,因此选择数据不是瓶颈(直到达到很高的数字),这是另一个问题解。

另外,如果要使用IN选择索引,则数据库甚至不必搜索术语,它只需查看索引,然后直接转到每一行。

根据用户的应用,如果用户只查看显示的100个客户的一个或两个订单列表,则#4更好。

无论如何,考虑在循环中进行sql查询通常是一种不好的做法/不好的设计/不好的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM