我有两张桌子:
每位作家都有她写的书籍清单。 我想得到所有作家和他们的书。
在性能,服务器负载和数据库负载方面,更好的选择是什么:
选项A: 在编写器和书籍之间使用JOIN进行一次查询,从而为每个编写器生成多行,然后使用PHP代码重新排列数据(2级数组中的组)
选项B: 一个查询接收所有写入,然后遍历结果集并为每个作者的书执行另一个查询(更简单的PHP代码,但'写入数'+ 1个查询)
选项C: 还有其他建议的解决方案吗?
谢谢
答案 0 :(得分:3)
选项A实际上总是更好的选择,如果您已经知道需要所有已连接的数据,并且连接已通过索引进行了优化。
选项B是一种常见的反模式,它有一个名称: SELECT N + 1问题。它在网络应用程序中杀死性能是臭名昭着的。
问题是您不知道代码将运行多少查询,因为您可以在外部循环中获取多个编写器,并且每个编写者可能编写了许多书籍。您可以查询Erle Stanley Gardner!
这是Paul M. Jones关于Solving the N+1 Problem的一本很好的电子书,或者观看Paul在这里发表关于这个主题的演讲:https://www.youtube.com/watch?v=Fca-Ng0bzuk