【问题标题】:How to avoid calling DB queries inside of loops for child data如何避免在子数据的循环内调用数据库查询
【发布时间】:2017-09-08 17:23:37
【问题描述】:

我一直在努力找出处理显示子数据的最佳、最有效的方法。在我的具体情况下,我使用的是 PHP 和 MySQL,但我觉得这更像是一种“一般使用任何语言”的交易。

我的两个想法是(在本例中,我将列出发票及其行项目)

  1. 将子数据(发票项目)加入主数据(发票),以便只有一个查询我的问题是,假设发票上有 500 个行项目(可能不现实,但事情发生了),然后我会将 500 倍的整体发票数据从 MySQL 服务器发送到我的 PHP 脚本,这听起来很荒谬,因为我只需要一次。

  2. 第二个选项是在遍历发票并显示整体发票数据时,选择发票的行项目。当然,这现在与数据库的联系次数多了 500 次。

是否有任何其他选项可以处理这些具有逻辑意义的数据(使用给定的架构)?我几乎 100% 肯定有,因为我不敢相信我是第一个考虑这个问题的人,但我想我只是很难找到正确的方法来搜索关于这个主题的更多信息.

【问题讨论】:

    标签: php mysql database loops nested-queries


    【解决方案1】:

    将子数据(发票项)连接到主数据(发票),以便只有一个查询

    这是处理此要求的传统方式。它确实可以处理冗余数据,但存在一些开销。

    但是。

    1. 这就是可以指定从客户端到 RDBMS 的压缩连接的原因...压缩减轻了冗余数据的网络开销。
    2. 单个结果集中的冗余数据成本远低于重复查询。

    大多数人只是在这种应用程序中检索冗余数据。 Crystal Reports 等程序产品就是这样做的。

    如果它对您不起作用,您可以检索并保存一个结果集作为您的主记录......也许是这样的。

       SELECT master_id, name, address, whatever
         FROM master m
        WHERE m.whatever = whatever
        ORDER BY whatever
    

    然后,将它们放入 master_id 的关联数组中。

    然后,检索详细记录。

      SELECT d.master_id, d.detail_id, d.item, d.unit, d.quantity
        FROM detail d
        JOIN master m ON d.master_id = m.master_id
       WHERE m.whatever = whatever
       ORDER BY d.master_id, d.detail_id, whatever
    

    您将获得一个结果集,其中所有相关的详细记录(发票项目)都标记为 master_id 值。您可以将它们在您的 php 程序中与主记录相匹配。您基本上是在应用程序代码中进行连接。

    如果这一切听起来太让人头疼了……那就去寻找冗余数据并完成您的项目。如果需要,您可以随时进行优化。

    【讨论】:

    • 哦,哇,我没想到在 PHP 中将它结合在一起。我将用我的真实数据建立一个基准,看看这 3 种方法中的哪一种胜出。谢谢你,我什至没有考虑过压缩会减少数据大小
    • 好吧,经过对这三种方法的大量测试,在运行两个查询后将它们加入 PHP,一次用于父数据,两次用于所有子数据(至少在我的情况下)粉碎了另一个两个在性能方面。每个父行对子数据的调用显然丢失了并且根本没有扩展,而且我认为在我的情况下,查询变得很难索引所有额外的连接,所以查询成为了罪魁祸首。
    • 看起来如果可以优化查询,但是如果您要返回大量数据,则冗余数据选项可能最终是最快的。
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多