2013-01-17 103 views
0

這是產品表的結構。
目前有更多100萬條記錄。 當我使用查詢組& order by時,我遇到性能問題。 enter image description here按查詢優化分組排序

enter image description here

查詢:

SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2 

如何提高這個查詢執行得更快?我索引了store_id,ID是主鍵。

+1

表上有什麼索引? – OldProgrammer

+0

id - PRIMARY(索引名稱),store_id - store_id(索引名稱) –

+1

你能解釋這個查詢試圖做什麼嗎? 「以與ID相反的順序從商店中選擇兩個任意產品名稱」似乎並不特別有用。 –

回答

0

你想這樣的查詢:

select p.* 
from product p join 
     (select store_id, max(id) as maxid 
     from product p 
     group by store_id 
    ) psum 
     on psum.store_id = p.store_id and p.id = maxid 

您沒有任何表的日期,所以我假設最大的ID是最近的。

+0

嗨,我需要2記錄只。 –

+0

你不需要在子查詢中輸出'store_id',你應該加入你的'maxid'。 – newtover

+0

@newtover。 。 。感謝您在加入時遇到問題。該查詢基於評論。原始查詢對我來說沒有多大意義。 –

0
SELECT x.* 
    FROM my_table x 
    JOIN (SELECT store_id, MAX(id) max_id FROM my_table GROUP BY store_id) y 
    ON y.store_id = x.store_id 
    AND y.max_id = x.id 
ORDER 
    BY store_id DESC LIMIT 2; 
+0

加入'max_id'就足夠了,因爲'id'是主鍵。 – newtover

0

哈克(但快)解決方案:

SELECT product_name 
FROM (
    SELECT id 
    FROM vs_product 
    GROUP BY store_id DESC 
    LIMIT 2) as ids 
JOIN vs_product USING (id); 

它是如何工作

你以升序指數STORE_ID店(STORE_ID,ID)對。 GROUP BY DESC將使MySQL以相反的順序讀取索引,即子查詢將獲取每個store_id的最大ID。然後,您只需將其加入整個表格即可獲取產品名稱。

請注意,查詢將爲商店ID獲取具有最大值的兩個產品名稱。