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
任何人都可以帮忙吗?
猜测不好。如果您想知道系统如何使用2000个产品和50个标签执行,请生成大量样本数据。生成10K样本事务,并使用MySQL的EXPLAIN'查询'对样本运行查询。重复100K和1M交易。 – 2011-03-01 12:20:19