1

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

通常是否“更好”:

  1. 执行一个查询,GROUP_CONCAT尽可能使用并以编程方式拆分结果(返回的连接的长度有限制)
  2. 在遍历“父查询”的结果时对每一行执行“子查询”
  3. 执行一个“父查询”以返回客户列表,并使用 SQLIN关键字执行一个“订单”查询以匹配从前一个查询返回的 customer_ID。循环通过客户查询的结果,我们可以看到 customer_ID 是否存在于订单查询中,并显示匹配的订单。
  4. 在何时执行第二个查询。原因是我们并不总是希望看到每个父结果的子结果(使用网络应用程序,我们可以使用 AJAX 来获取子结果)
  5. 还有什么?

我一直倾向于#2,因为从概念上讲它似乎是最干净的解决方案,但我不禁认为它是一种资源消耗。对一组特定的结果进行我们自己的基准测试,#3 出来的速度最快。#4 似乎应该是最快的,因为某些应用程序不需要显示所有结果,但是,目的可能是让结果准备好并等待,而不是再次往返来检索该行的子数据。我不完全确定FETCH_ASSOCetc. 的机制是如何工作的,但是非常欢迎任何建议!

4

1 回答 1

2

我觉得#3更好。我建议获取所有客户,然后列出该客户的所有订单(customer_ID IN (...)),然后在需要时将订单发送给 php 方面的正确客户。

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

请记住,查询的大部分开销来自查询本身(传输查询,然后取回数据) 数据库针对搜索和连接等内容进行了高度优化,因此选择数据不是瓶颈(直到您达到非常高的数字)所以它是另一个解决方案。

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

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

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

于 2013-06-07T13:41:57.697 回答