2010-05-28 40 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来选择它。