2010-05-28 60 views
0

我有一個SQL查詢,我正在努力優化。它基本上用於拉回購物車的產品。每個產品都使用多個表product_tag附加了標籤,並且我還從一個單獨的商店表中拉回了一個商店名稱。我使用group_concat來獲取顯示標籤列表(這就是爲什麼我在底部有奇怪的groupby orderby子句),我需要通過dateadded命令,先顯示最新的預定產品。這裏是查詢....MySql產品標籤查詢優化

SELECT `products`.*, `stores`.`name`, GROUP_CONCAT(tags.taglabel ORDER BY tags.id ASC SEPARATOR " ") taglist 
FROM (`products`) 
JOIN `product_tag` ON `products`.`id`=`product_tag`.`productid` 
JOIN `tags` ON `tags`.`id`=`product_tag`.`tagid` 
JOIN `stores` ON `products`.`cid`=`stores`.`siteid` 
WHERE `dateadded` < '2010-05-28 07:55:41' 
GROUP BY `products`.`id` ASC 
ORDER BY `products`.`dateadded` DESC 
LIMIT 2 

不幸的是即使有一小部分數據(3標籤和約12產品)查詢運行00.0034秒。最終我想要在這個系統中有大約2000個產品和50個tags(即時猜測這將是非常slooooow)。這裏是ExplainSql ...

id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra 
1|SIMPLE|tags|ALL|PRIMARY|NULL|NULL|NULL|4|Using temporary; Using filesort 
1|SIMPLE|product_tag|ref|tagid,productid|tagid|4|cs_final.tags.id|2| 
1|SIMPLE|products|eq_ref|PRIMARY,cid|PRIMARY|4|cs_final.product_tag.productid|1|Using where 
1|SIMPLE|stores|ALL|siteid|NULL|NULL|NULL|7|Using where; Using join buffer 

任何人都可以幫忙嗎?

+0

猜測不好。如果您想知道系統如何使用2000個產品和50個標籤執行,請生成大量樣本數據。生成10K樣本事務,並使用MySQL的EXPLAIN'查詢'對樣本運行查詢。重複100K和1M交易。 – 2011-03-01 12:20:19

回答

0

IMO,你不需要擔心。

  • 擁有2000個產品不會比20個產品長100倍。這就是索引(和數據庫,真的......)。
  • 2000個記錄對於MySQL來說仍然是一個非常小的表格。

我認爲你可以保持原樣,你很快就會發現它運行良好。

只有結果集得到確實是大(比系統內存大 - 例如幾個GB),排序可能需要一段時間,因爲數據庫將使用磁盤,這是您可以開始擔心的時候。在這種情況下,爲未排序的結果創建一個臨時表是有用的,爲它添加一個索引,並且用ORDER BY來選擇它。