Mysql table 加入需要太多时间,而简单 select 结果很快

Mysql table join taking too much time, while simple select results fast

我有一个 InnoDB table daily_sales_msr.

当我运行一个查询从那个table没有加入,这个查询returns的输出很快。

但是,如果我加入那个 table 连同一个小的 table,那么它会花费太多时间。这个问题的解决方案是什么?

例如:

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多秒。

没有任何join只需要0.15s

为了性能请确保您有合适的索引
在您的情况下,您可以在

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

而对于 SQL 您正在使用分组依据,但 select 中不在分组中的某些列与聚合函数无关 在 mysql 从 5.7 开始的大多数数据库引擎中,这不是默认允许的。这些列的结果是不可预测的 所以你应该将这些列添加到分组

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