2012-07-08 43 views
1

我想優化,我已經得出結論,該順序並不重要查詢。所以我想在以下情況下刪除ORDER BYMySQL的 - 組順序不排序

SELECT item, price FROM supplydemand 
    GROUP BY item 
    ORDER BY timestamp ASC 

這裏是發生了什麼事情:表supplydemand跟蹤價格的各種物品。對於每個物品我有4或5個不同的價格,因此不同的行。上面的查詢爲我提供了每件商品的「最古老」價格。分組是在項目上完成的,升序時間戳給我最舊的一行。此查詢正常工作。

我發現只要我有最古老的代價,我真的不關心,如果返回的行進行排序。所以我想擺脫ORDER BY。這是我已經嘗試過的:

SELECT item, price, timestamp FROM supplydemand 
    GROUP BY item 
    HAVING timestamp = MIN(timestamp) 

上面的查詢應導致一個相同的數據,除非沒有排序。該MIN內的HAVING必須依靠GROUP因此每個分組項的時間戳比較組內最古老的時間戳。

問題
第二個查詢返回的行較少。由於某些原因,第二個查詢中缺少某些行,我無法弄清楚原因。其餘的行返回相同的價格,但我錯過了近20%的數據。

+0

'MIN(時間戳)'是全球整個表。 – 2012-07-08 15:03:30

+0

然後我只收到1行左右。 MIN()運行在'GROUP',而不是全局 – Mikhail 2012-07-08 15:06:10

+0

我開始懷疑我的*原*查詢其實是錯誤的。它先分組,然後分類,這不是我想要的 – Mikhail 2012-07-08 15:17:59

回答

1
SELECT item, price, timestamp 
FROM SupplyDemand 
INNER JOIN (
    SELECT item, MIN(timestamp) AS minimumtimestamp FROM SupplyDemand 
) AS minimums 
ON minimums.item = SupplyDemand.item AND minimums.minimumtimestamp = supplydemand.timestamp 

將是一種方式。

+0

除了您選擇的大寫字母,這與我剛剛爲自己做出的相同查詢是一樣的。作爲一個便箋 - 加快我的大小桌子是微不足道的。 – Mikhail 2012-07-08 15:26:05

+0

如果縮放是一個問題,那麼Item和Timestamp上的索引應該對它進行排序。懷疑你會看到顯着的性能提升,直到你達到一個相當數量的數據。 – 2012-07-08 15:30:50

+0

我通常會在可能是查詢過濾器的任何東西上拋出索引 – Mikhail 2012-07-08 20:21:07