原来业务上会cancel掉一个order或者order中的某个item, 而由于老系统设计的关系, cancel的时候不是改状态, 而是将对应的id设为负值.
而现在的报表需要找到曾经出现过某个状态的item列表, 而这些item现在可能是cancel掉也可能是正常的.
主要串了3张表, 三张表上order_id, item_id都有索引.
但是因为正负值的关系, 串表的时候都使用了abs, 这就到这3个表上的索引在则个sql中全部无效.
tuning方法是将abs串表改为正常的正负值串表, 最终用union, 将结果集合并, 并处理好串表时候的条件, 保证至少有一个join部分能够走到索引.
这样最终结果虽然效率也不是很高, 因为每段sql语句都还是会有一部分要走全表扫描, 但只要控制好表连接顺序将走全表扫描的尽量放到最后, 效果已经比原来的好多了. 原来几个小时也跑不出来的, tuning以后十几秒就出来了.
没有评论:
发表评论