2017-02-08 37 views
0

我有這個查詢,根據日期顯示最後的idid_units使用MAX優化查詢(id)

我的查詢是:

SELECT max(swg.id) AS id 
FROM swg 
WHERE swg.status != 0 
AND sg.dateswg <= TIMESTAMPADD(DAY,(6-WEEKDAY('2015-12-28')),'2015-12-28') 
GROUP BY swg.id_units 
ORDER BY swg.id; 

查詢返回超過2000條記錄,我覺得有一種方法,我可以表現這個查詢。

我試圖表現我的查詢是這樣的:

SELECT id 
FROM (SELECT * FROM swg WHERE status != 0 AND dateswg <= TIMESTAMPADD(DAY,(6-WEEKDAY('2015-12-28')),'2015-12-28') ORDER BY id_units, id desc) x 
GROUP BY id_units; 

它的作品,但我想知道是否有改進它

方面的另一種方式!

+1

你有沒有索引? –

+0

而不是'ORDER BY id',使查詢正確! – jarlh

+0

不,我沒有@Prdp –

回答

0

這是您的查詢:

SELECT max(swg.id) AS id 
FROM swg 
WHERE swg.status <> 0 AND 
     swg.dateswg <= TIMESTAMPADD(DAY, 6 - WEEKDAY('2015-12-28'), '2015-12-28') 
GROUP BY swg.id_units 
ORDER BY MAX(swg.id); 

這是棘手的優化,因爲索引不能用於兩個條件。您可以在查詢中使用的所有四列的綜合指數開始:swg(dateswg, status, id_units, id)

+0

感謝您的回答,我將回顧我如何做到這一點 –

0

status只有兩種01,然後換status = 1以便優化有一個地方去尋找,而不是兩個不相交的地方。然後有

INDEX(status, dateswg, id_units, id) -- in this order. 

這將是WHERE相當不錯,將是「覆蓋」。

不幸的是,GROUP BYORDER BY都需要排序;後者將是2000行,並且可能在RAM中完成;我無法告訴前者。