【问题标题】:Is there any way i can optimise the query below?有什么办法可以优化下面的查询吗?
【发布时间】:2017-03-25 19:23:56
【问题描述】:

我在 MySQL 中有以下查询。它显示mysql服务器消失了。查询有什么问题?

SELECT Customer.id,
       Customer.first_name,
       Customer.last_name,
       Sum(Sale.`cal_qty`) AS totPurchase,
       Sale2.tot2          AS totPurchase2
FROM   `customers` AS Customer
       LEFT JOIN `sales` AS Sale
              ON Sale.customer_id = Customer.id
       LEFT JOIN (SELECT s2.customer_id  AS customer_id,
                         Sum(s2.cal_qty) AS tot2
                  FROM   sales AS s2
                  WHERE  s2.sale_date BETWEEN '2015-08-13' AND '2015-09-11'
                  GROUP  BY s2.customer_id) AS Sale2
              ON Sale.customer_id = Sale2.customer_id
WHERE  Sale.sale_date BETWEEN '2015-09-12' AND '2015-10-12'
GROUP  BY Sale.`customer_id`

请提出我可以对此查询进行的任何优化。它已经正确地索引了所需的列。

【问题讨论】:

  • 请提供正确的 DDL 并解释。 LEFT JOIN sale... WHERE sale 也等于 INNER JOIN sale,所以你不妨这样写。
  • 按 customer_id 和日期编制索引。这个 sql 查询需要什么。它应该根据 customer_id 给出上个月的销售额和上个月到上个月的销售额。需要判断客户是否比上个月做的多,如果没有,那么在获取结果后他不应该进入这个列表。
  • 提高英语回答

标签: mysql optimization group-by


【解决方案1】:

请提供SHOW CREATE TABLE

请解释LEFT 的必要性。如果不能,请摆脱LEFT

添加这些索引:

INDEX(sale_date)
INDEX(customer_id, sale_date)

【讨论】:

    【解决方案2】:

    首先,您的 WHERE 子句限定了 SALE 表,从而将其转换为 JOIN 与 LEFT JOIN。由于这是您的标准的主要依据,我会在调整查询(和缩短的别名)时将其置于领先位置

    对于索引优化,单个索引应该在 WHERE AND GROUP by 上,但也应该包含可以在 JOIN 中使用的任何列。

    销售表... 索引(销售日期、客户 ID、日历数量)

    这将优化按客户分组的日期对销售活动的外部和内部查询。拥有一个包含 Cal_Qty 字段的“覆盖”索引可以防止返回到原始数据页面进行查询。它可以直接从索引组件中完成所有需要。

    客户表应该有一个 ON (id) 索引,因为它是要连接的那个表的主键。

    SELECT 
          C.id,
          C.first_name,
          C.last_name,
          Sum(S.cal_qty) AS totPurchase,
          Sale2.tot2 AS totPurchase2
       FROM   
          sales S
             JOIN customers AS C
                ON S.customer_id = C.id
             LEFT JOIN ( SELECT 
                               s2.customer_id  AS customer_id,
                               Sum(s2.cal_qty) AS tot2
                            FROM   
                               sales AS s2
                            WHERE  
                               s2.sale_date BETWEEN '2015-08-13' AND '2015-09-11'
                            GROUP BY 
                               s2.customer_id ) AS Sale2
                ON S.customer_id = Sale2.customer_id
       WHERE  
          S.sale_date BETWEEN '2015-09-12' AND '2015-10-12'
       GROUP BY 
          S.customer_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2014-07-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多