Mysql表联接花费太多时间,而简单的选择结果却很快

时间:2018-09-02 05:26:54

标签: mysql inner-join innodb

我有一个InnoDB表daily_sales_msr

当我在没有联接的情况下从该表运行查询时,该查询会迅速返回输出。

但是,如果我将该表连接到一个小表,那么这将花费太多时间。该问题的解决方法是什么?

例如:

SELECT
sku.ssku,
ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
MONTHNAME(daily_sales_msr.date) AS `month`
FROM
daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE
daily_sales_msr.date BETWEEN '2018-08-01'
AND '2018-08-08'
GROUP BY
daily_sales_msr.skid

此查询耗时超过1000秒。

不进行任何连接仅需0.15秒。

1 个答案:

答案 0 :(得分:1)

为确保性能,请确保您具有正确的索引
您可以在

上使用复合索引
table daily_sales_msr for  columns  (skid,date) 

,对于SQL,您正在使用分组依据,但select not in group中的某些列与聚合功能无关 这在大多数以mysql开始形式5.7的db引擎e中并没有被defualt分配。这些列的结果是不可预测的 所以您应该将这些列添加为

SELECT
  sku.ssku,
  ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
  MONTHNAME(daily_sales_msr.date) AS `month`
FROM  daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE  daily_sales_msr.date BETWEEN '2018-08-01'  AND '2018-08-08'
GROUP BY  daily_sales_msr.skid, month 

或对这些列也使用聚合函数

SELECT
  sku.ssku,
  ROUND(SUM(daily_sales_msr.sale), 3) AS sale,
  MAX(MONTHNAME(daily_sales_msr.date)) AS `month`
FROM  daily_sales_msr
INNER JOIN sku ON sku.id = daily_sales_msr.skid
WHERE  daily_sales_msr.date BETWEEN '2018-08-01'  AND '2018-08-08'
GROUP BY  daily_sales_msr.skid