这是我一直在弹出的主题。对于返回行列表的查询类型,我们通常希望执行进一步的查询以收集有关该特定行的更多信息,这通常包括本身返回行列表的查询。例如,订单系统返回客户列表,每个客户“行”也可以显示订单列表(可能在弹出对话框中)。
通常“更好”:
GROUP_CONCAT
并以编程方式拆分结果(返回的连接长度有限制)IN
关键字返回客户列表和一个“订单”查询,以匹配从上一个查询返回的customer_ID。循环查看客户查询的结果,我们可以查看订单查询中是否存在customer_ID并显示匹配的订单。我一直倾向于#2,从概念上讲它似乎是最干净的解决方案,但我不禁认为这是一种资源匮乏。为特定的结果集做我们自己的基准测试,#3最快。 #4似乎应该是最快的,因为一些应用程序不需要显示所有结果,但是,目的可能是让结果准备好并等待,而不是另一个往返来检索该行的子数据。我不完全确定FETCH_ASSOC
等的机制是如何工作的,但是非常欢迎任何建议!
答案 0 :(得分:2)
我认为#3更好。 我建议获取所有客户,然后列出该客户的所有订单(customer_ID IN(...)),然后在需要时将订单发送给php侧的正确客户。
这样,您只获得两个包含所有信息的查询,并且可以避免调度部分(取决于在此查询之后要执行的逻辑)。
请记住,查询本身的大部分开销来自查询本身(传输查询,然后获取数据) 数据库针对搜索和连接等方面进行了高度优化,因此选择数据不是瓶颈(直到达到非常高的数字),因此这是另一种解决方案。
另外,如果您使用IN选择索引,数据库甚至不必搜索该术语,只需查看索引,然后直接转到每一行。
根据您的应用程序,如果用户仅查看显示的100个客户的一个或两个订单列表,则#4会更好。
无论如何,考虑在循环中进行SQL查询通常是一种不好的做法/糟糕的设计/错误的逻辑。