【问题标题】:Should I use one big SQL Select statement or several small ones?我应该使用一个大的 SQL Select 语句还是几个小的 SQL Select 语句?
【发布时间】:2010-09-08 12:01:09
【问题描述】:

我正在使用从 MySQL 发送的数据构建一个 PHP 页面。

有没有更好

  • 1 SELECT 查询与 4 个表连接,或
  • 4 个小 SELECT 查询,没有表连接;我确实从 ID 中选择

哪种方法更快,每种方法的优缺点是什么?我只需要每个表中的一行。

【问题讨论】:

    标签: php mysql performance optimization


    【解决方案1】:

    如果您真的很担心,您应该运行一个分析工具,因为它取决于很多事情并且可能会有所不同,但通常最好编译更少的查询和更少的数据库往返。

    确保尽可能使用 where 和 join on 子句过滤内容。

    但老实说,这通常无关紧要,因为与数据库可以做的相比,您可能不会受到那么大的打击,所以除非优化是您的规范,否则您不应该过早地做它并做最简单的事情。

    【讨论】:

      【解决方案2】:

      一般来说,最好有一个 SELECT 语句。拥有数据库的主要原因之一是它们处理信息的速度很快,尤其是查询格式的信息。

      如果这种方法有任何缺点,那就是有些类型的分析无法用一个大的 SELECT 语句来完成。 RDBMS 纯粹主义者会坚持认为这是一个数据库设计问题,在这种情况下,您将回到我最初的建议。

      【讨论】:

        【解决方案3】:

        当您使用 JOIN 而不是多个查询时,您允许数据​​库应用其优化。您还可能会检索不需要的行(如果您要用多个选择替换 INNER 联接),这会增加您的应用程序服务器和数据库服务器之间的网络流量。即使它们在同一个盒子上,这也很重要。

        【讨论】:

          【解决方案4】:

          这可能取决于您从数据库中获取数据后如何处理数据。如果您独立使用这四个结果中的每一个,那么拥有四个单独的 SELECT 语句会更加合乎逻辑和清晰。另一方面,如果您将所有数据一起使用,例如在表中创建统一的行之类的,那么我会使用单个 SELECT 和 JOIN。

          我已经完成了一些 PHP/MySQL 工作,我发现即使对于包含大量 JOIN 的大型表的查询,数据库也非常擅长优化 - 如果您有智能索引的话。因此,如果您对性能很认真,请开始阅读 query optimization and indexing

          【讨论】:

            【解决方案5】:

            我会说 1 个带有连接的查询。这样,您只需访问服务器一次。如果你的表是用索引连接的,它应该很快。

            【讨论】:

              【解决方案6】:

              在 Oracle 下,您希望利用查询缓存,如果您在顺序处理中有很多小查询,如果最后一个查询将第一个查询从缓存中推出,那就太糟糕了...正好赶上您循环并在下一次传递时再次运行第一个查询(显然使用不同的参数值)。

              我们正在使用 Java 存储过程构建 XML 输出文件,并且肯定发现每个单独查询的往返时间都在吞噬我们。我们发现在尽可能少的查询中获取所有数据,然后根据需要将这些值插入 XML DOM 会快得多。

              唯一的缺点是 Java 代码不太优雅,因为数据获取现在远离它的使用。但是我们必须在尽可能接近零的时间内生成一个大型的复杂 XML 文件,因此我们必须针对速度进行优化。

              【讨论】:

                【解决方案7】:

                但是,在处理合并表时要小心。根据我的经验,虽然在大多数情况下单个连接可能很好,但当涉及合并表时,您可能会遇到奇怪的情况。

                【讨论】:

                  猜你喜欢
                  • 2016-06-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-05
                  • 2013-10-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-01-05
                  • 2013-06-11
                  相关资源
                  最近更新 更多