這是產品表的結構。
目前有更多100萬條記錄。 當我使用查詢組& order by時,我遇到性能問題。 按查詢優化分組排序
查詢:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
如何提高這個查詢執行得更快?我索引了store_id,ID是主鍵。
這是產品表的結構。
目前有更多100萬條記錄。 當我使用查詢組& order by時,我遇到性能問題。 按查詢優化分組排序
查詢:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
如何提高這個查詢執行得更快?我索引了store_id,ID是主鍵。
你想這樣的查詢:
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是最近的。
嗨,我需要2記錄只。 –
你不需要在子查詢中輸出'store_id',你應該加入你的'maxid'。 – newtover
@newtover。 。 。感謝您在加入時遇到問題。該查詢基於評論。原始查詢對我來說沒有多大意義。 –
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;
加入'max_id'就足夠了,因爲'id'是主鍵。 – newtover
哈克(但快)解決方案:
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獲取具有最大值的兩個產品名稱。
表上有什麼索引? – OldProgrammer
id - PRIMARY(索引名稱),store_id - store_id(索引名稱) –
你能解釋這個查詢試圖做什麼嗎? 「以與ID相反的順序從商店中選擇兩個任意產品名稱」似乎並不特別有用。 –