我有一个正在努力优化的sql查询。它基本上是用来为购物车拉回产品的。每个产品都有使用多对多表product_tag附加的标签,我还从一个单独的商店表中拉回了一个商店名称。我正在使用group_concat来获取用于显示的标记列表(这就是为什么我在底部有奇怪的groupby orderby子句),并且我需要按dateadded排序,首先显示最新的预定产品。下面是查询...
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个标签(我猜这将是非常慢的)。这就是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有人能帮上忙吗?
发布于 2011-03-01 15:34:13
国际海事组织,你不用担心。
拥有2000个产品的
我认为您可以让查询保持原样,您很快就会发现它运行得很好。
只有当结果集的变得非常大(比系统内存大--例如几GB)时,排序可能需要一段时间,因为DB将使用磁盘,这时您就可以开始担心了。在这种情况下,有时可以为未排序的结果创建一个临时表,在表中添加索引,然后使用ORDER BY从表中进行选择。
https://stackoverflow.com/questions/2928868
复制相似问题