我有一张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 s。
没有任何连接,它只需要0.15秒。
发布于 2018-09-02 06:31:24
对于性能,请确保有适当的索引。
在您的例子中,您可以在
table daily_sales_msr for columns (skid,date) 对于SQL,您使用的是group,但select中的某些列与聚合函数无关,这在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.skidhttps://stackoverflow.com/questions/52134230
复制相似问题