我有一个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秒。
答案 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