0
是否有任何方法可以避免在此類查詢中創建臨時表?避免在查詢中使用group by和order by時創建臨時表
SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;
我試圖創建索引(item_id, item_created)
和(item_created, item_id)
,但這並沒有幫助。
是否有任何方法可以避免在此類查詢中創建臨時表?避免在查詢中使用group by和order by時創建臨時表
SELECT item_id FROM titem
GROUP BY item_id
ORDER BY item_created;
我試圖創建索引(item_id, item_created)
和(item_created, item_id)
,但這並沒有幫助。
您的查詢存在問題。何時爲每個組選擇了哪個item_created? MySQL默認會爲每個組選擇一個或多或少的隨機組(從組內)。由於每個組只使用一個item_created,因此需要臨時表對其進行排序。
我會建議你使用其中一個聚合函數,例如min()或max()來獲取一個定義好的item_created來排序。這仍然不能解決臨時表問題,item_id上的索引是關於您可以做的最好的。
SELECT item_id, max(item_created) as ic FROM titem
GROUP BY item_id
ORDER BY ic;
這是有趣的是,一些數據庫如Oracle(有人告訴我)拋出和錯誤在你原來的查詢作爲item_created既不是在聚合函數所選擇的領域也不是該組中的條款。 MySQL可以被設置爲模仿這種行爲。
item_created - 是一個非規格化字段(來自表項),因此對於一個uniq_id,item_created將是相同的。我將它非規範化的原因是使用索引進行排序。它完美的工作,直到我需要使用group-by。 – 2010-12-20 07:58:57
您可能會覺得這篇文章很有趣。 http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html – Jaydee 2010-12-20 09:30:47