【问题标题】:SQL query for large amount of data with many joins对具有许多连接的大量数据的 SQL 查询
【发布时间】:2014-12-23 13:00:51
【问题描述】:

我已经为我的需求编写了一个 sql 查询。
这对我来说很好。这需要 0.0006 秒来执行。

我想从 sql 专家那里知道“这适用于大量数据吗?”。

我在下面写了我的查询。

SELECT HM_customers.id,
       HM_customers.username,
       HM_customers.firstname,
       HM_customers.lastname,
       HM_customers.company,
       HM_customers_address_bank.field_data
FROM   HM_orders
       JOIN HM_order_items
         ON HM_order_items.order_id = HM_orders.id
       JOIN HM_bid
         ON HM_order_items.bid_id = HM_bid.bid_id
       JOIN HM_customers
         ON HM_bid.user_id = HM_customers.id
       JOIN HM_customers_address_bank
         ON HM_customers_address_bank.id = HM_customers.default_billing_address
WHERE  HM_orders.id = '4' 

任何专家都可以建议我或让我知道如何改进此查询。如果此查询有任何问题,请建议我。

注意:- 这是一个简单的查询。但我想知道,这是否可以用更少的时间处理大量数据

【问题讨论】:

  • 查询 ifself 是默认连接。没什么特别的。如果查询变慢,请添加索引。
  • 是的,我对这个查询没有什么特别的了解。但我想知道这是否适用于大量数据。我不擅长 mysql 查询...
  • 正如其他人所说,这个查询并没有什么特别之处。它应该运行良好。但是,如果您开始遇到性能问题,您应该为适当的列添加索引,或者咨询您的 DBA 以获得建议。
  • 不要尝试同时对两个不同的 RDBMS 运行查询。它可能会变得混乱。

标签: mysql sql-server


【解决方案1】:

您不需要包含orders 表:

SELECT c.id,
       c.username,
       c.firstname,
       c.lastname,
       c.company,
       cb.field_data
FROM   HM_order_items oi
       JOIN HM_bid b
         ON oi.bid_id = b.bid_id
       JOIN HM_customers c
         ON b.user_id = c.id
       JOIN HM_customers_address_bank cb
         ON cb.id = c.default_billing_address
WHERE  oi.order_id = '4'; 

如果客户多次对相同商品出价,您的查询也可能导致重复行。如果您输入select distinct,那么您将产生重复消除的开销。如果这成为问题,您可能需要将查询重组为exists

【讨论】:

  • 我必须获取特定订单的数据
  • @HiraSingh 。 . .订单 ID 在order_items 表中。您无需加入 orders 即可获得它。
  • distinct 执行时间过长,接近 0.0015 秒
  • @HiraSingh 。 . .你的时间,以毫秒为单位,真的没有任何意义。您必须在足够大的数据上测试查询才能有所作为。此外,查询计划取决于表上的统计信息(有时),因此您无法使用小数据的指导来了解大数据上会发生什么。
【解决方案2】:

有几点值得注意

1) WHERE 子句中对外部表列的引用可防止 OUTER JOIN 返回任何不匹配的行,这会将查询隐式转换为 INNER JOIN。这可能是查询中的错误或对 OUTER JOIN 工作原理的误解。

2) 如果表的架构发生变化,选择所有带有 * 通配符的列将导致查询的含义和行为发生变化,并可能导致查询检索到过多的数据。您应该只选择您需要的列。

【讨论】:

    【解决方案3】:

    请将您的驱动表设置为“HM_customers”,因为您的所有数据都来自该表并像这样更改您的联接,希望这会对您有所帮助:)

    SELECT hmCust.id,
           hmCust.username,
           hmCust.firstname,
           hmCust.lastname,
           hmCust.company,
           hmCustAdd.field_data
    FROM   HM_customers hmCust
           INNER JOIN HM_bid hmBid
                   ON hmBid.user_id = hmCust.id
           INNER JOIN HM_customers_address_bank hmCustAdd
                   ON hmCustAdd.id = hmCust.default_billing_address
           INNER JOIN HM_order_items hmOrderItem
                   ON hmOrderItem.order_id = hmBid.bid_id
           INNER JOIN HM_orders hmOrder
                   ON hmOrder.id = hmOrderItem.order_id
    WHERE  hmOrder.id = '4' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2018-04-26
      • 2012-01-01
      • 2014-03-09
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多