首页 新闻 会员 周边

这句SQL怎么优化

0
悬赏园豆:15 [已解决问题] 解决于 2015-08-06 11:00
 1 SELECT 
 2 om.COLLEGE_NAME AS collegeName,
 3 COUNT(1) AS QUANTITY,
 4 SUM(od.INQUIRE_PRICE) AS AMOUNT,
 5 SUM(CASE WHEN od.INQUIRE_PRICE > bo.BID_PRICE THEN (od.INQUIRE_PRICE - bo.BID_PRICE)/od.INQUIRE_PRICE
 6 ELSE (od.INQUIRE_PRICE - a.MIN_BID_PRICE)/od.INQUIRE_PRICE END)/COUNT(1) AS saveRate
 7 FROM cp_bid_order bo 
 8 LEFT JOIN co_order_detail od ON bo.DETAIL_ID = od.DETAIL_ID 
 9 LEFT JOIN co_order_main om ON bo.ORDER_MAIN_ID=om.ORDER_MAIN_ID
10 LEFT JOIN 
11 (SELECT 
12 DETAIL_ID AS DETAIL_ID,
13 MIN(BID_PRICE) AS MIN_BID_PRICE 
14 FROM cp_bid_order 
15 GROUP BY DETAIL_ID) a 
16 ON bo.DETAIL_ID = a.DETAIL_ID
问题补充:

完整的语句还有条件的

WHERE
om.CHOOSE_OPTION != 2
AND om.ORDER_TYPE != 2
AND bo.BID_STATUS = 'Y'
AND od.INQUIRE_PRICE != 0

om.CHOOSE_OPTION,om.ORDER_TYPE都是varchar型的,

而我做判断的时候,让它们跟数字进行判断

昨天我这样写的时候在mysql执行需要74秒

 

今天我改成如下写法,让那两个字段跟字符型做比较

执行完成只需39秒左右

WHERE 
om.CHOOSE_OPTION != '2' 
AND om.ORDER_TYPE != '2' 
AND bo.BID_STATUS = 'Y' 
AND od.INQUIRE_PRICE != 0

想问一下这是什么原因呢?

Catcher_8的主页 Catcher_8 | 初学一级 | 园豆:151
提问于:2014-12-02 16:54
< >
分享
最佳答案
0

case when 是性能杀手

left join是性能杀手

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-12-02 16:56

那有什么方法可以替代一下吗?

Catcher_8 | 园豆:151 (初学一级) | 2014-12-02 16:59

@kcher: 你那个case when是不需要的,

直接 ABS(od.INQUIRE_PRICE - bo.BID_PRICE)/od.INQUIRE_PRICE,

Simple is better.

另外,Left join可能也不需要,这个得你自己看。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-02 17:08
其他回答(6)
0

先用性能监视器查出性能瓶颈在哪里呀!!!

收获园豆:5
XiaoFaye | 园豆:3087 (老鸟四级) | 2014-12-02 17:04
0

创建个临时表,分开来一步步UPDATE

风醉 | 园豆:1197 (小虾三级) | 2014-12-02 17:08
0

支持 楼上 先用性能监视器查出性能瓶颈在哪里呀!!!

Albert Fei | 园豆:2102 (老鸟四级) | 2014-12-02 17:28
0

SELECT 12 DETAIL_ID AS DETAIL_ID, 13 MIN(BID_PRICE) AS MIN_BID_PRICE 14 FROM cp_bid_order 15 GROUP BY DETAIL_ID  先查出来放在临时表里面 

我是糖糖 | 园豆:446 (菜鸟二级) | 2014-12-02 17:43
0

用公用表达式With

Halower | 园豆:1723 (小虾三级) | 2014-12-03 12:48
0

目测是:cp_bid_order 的 GROUP BY 慢,没有任何条件的查询.

试着查询每个表,看哪个表慢,加条件试,再 join 

老张一笑 | 园豆:215 (菜鸟二级) | 2014-12-25 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册