日期:2014-05-16  浏览次数:20836 次

SQL 优化求助
逻辑场景
商品销售统计分析
需求 
统计在 某一时间段内 以各商品分类下销售的商品为纬度 产生的购买记录 我的sql是这样子的
商品表 zhaipin_goods
商品分类表 zhaipin_category
订单表 zhaipin_order_info
订单商品表 zhaipin_order_goods
我写的SQL
SQL code

SELECT 
C.cat_name AS cat_name,
SUM(OG.goods_number) AS total_sell_num,
SUM(OI.order_amount) AS total_sell_amount 
FROM `zhaipin_category` AS C 
RIGHT JOIN `zhaipin_goods` AS G ON C.cat_id = G.cat_id 
RIGHT JOIN `zhaipin_order_goods` AS OG ON OG.goods_id=G.goods_id 
LEFT JOIN `zhaipin_order_info` AS OI ON OI.order_id=OG.order_id 
AND OI.pay_status = 2 
AND shipping_time >= ('1325318400'-8*60*60) 
AND shipping_time <= ('1338242092'-8*60*60)
GROUP BY C.cat_id


EXPLAIN 的结果

在线求助 数量级在100W的表


------解决方案--------------------
AND OI.pay_status = 2 
AND shipping_time >= ('1325318400'-8*60*60) 
AND shipping_time <= ('1338242092'-8*60*60)
这些是过滤条件不是连接条件吧,应该写成
where OI.pay_status = 2 
AND shipping_time >= ('1325318400'-8*60*60) 
AND shipping_time <= ('1338242092'-8*60*60)
我很奇怪shipping_time 是OI表的字段,但是你这么些为什么没有报错呢?
OG表的连接字段是OG.goods_id和OG.order_id这里也许要把两个字段建成组合索引(猜的。。。),可以试试
还有都写成左连接好看些。
------解决方案--------------------
表的优化和数据库机器的内存也是有关系的。
------解决方案--------------------
zhaipin_order_goods表里把
goods_id和order_id这两个字段建成组合索引
谁在前谁在后我也不清楚,试一试。。