做单个 SQL SELECT 与连接相比几个更小的 SQL 更有效吗?

Is it more efficient to do a single SQL SELECT with joins vs several smaller SQLs?

我有使用长 SELECT 语句的代码,这些语句通常 LEFT JOIN 各种表使用某种 idkey 连接在一起数据。

此 SQL 的结果然后输入到 PHP class 结构中。结果可以包含例如

我的代码结构不是很好,所以我想代替一个长的 SQL 查询,将它分成几个(即在本例中为 3 个)更小的简单 SQL SELECT秒。好处是代码会更清晰、更容易理解,并且可以更好地重构为更小、更有意义的 classes 和函数。

但在我开始拆解大量看起来相似的 SQL 语句之前,我想检查一下从性能的角度来看,拆分 SQL 是否有意义。因为,或者我可以保持 long SQL 不变,并且仍然能够将我的代码重构为更有意义的 classes 和函数,但只是不同。

问题:最后,考虑到 PHP 和 MySql 如何协同工作,使用更长时间 SQL 是否有任何可衡量的好处s 通过多次调用更短的 SQLs 进行多次连接(可能没有任何连接)?

根据我的基准

  • 10,000 x 执行一个长 SQL 语句需要 1.5 秒
  • 10,000 x 执行等效的较短 SQL 语句需要 2.43 秒

长 SQL 获胜,很可能是因为 PHP 对于我的具体情况,通常处理更多的代码行。

与大多数事情一样 MySQL,视情况而定。你真的需要测试才能找到答案。

提交到数据库的每个 SQL 查询都会产生开销(解析、准备查询、执行、准备结果、响应提取、清理的开销)。这就是为什么大量往返数据库且查询很少(例如,一个非常紧密的循环,每个查询获取一行)的效率远低于 returns 所有行的单个查询。

另一方面,在 MySQL 5.6 之前,优化器使用的唯一连接方法是嵌套循环。如果没有合适的索引,或者有误导性的统计数据...

"large" 查询(即涉及数十个表和数百万行的查询)在性能方面可能存在问题。

但是数据库服务器通常在大小合理且索引适当的集合上执行正常的连接操作。数据库服务器上的连接操作通常比代码 运行ning 在应用程序服务器上执行的等效操作更有效。

问:是否存在可衡量的差异?

A:理论上是可以的。 (从理论上讲,理论和实践之间没有区别。在实践中,有。)

运行与数千个查询相比,一个查询的好处是开销更少,而且可以衡量差异。

一个查询的缺点是查询可能需要 MySQL 做很多工作以致于性能变得冰冷,有时我们可以通过将查询分成可管理的块来提高效率。我们通常不会注意到几个查询执行的开销......当我们进入成千上万的数据库往返时,我们 运行 陷入性能和可伸缩性问题。

要真正找出答案,既然您已经在考虑拆分查询,请继续将查询拆分为您计划 运行 的单个查询,然后进行测试。

(我关注的是数据库服务器方面的效率,而不是应用程序服务器的性能......我也一直在考虑数据库服务器在一台主机上,与应用服务器和数据库之间的网络连接...当你达到数万次往返时,毫秒网络往返开始增加。)