项目中有需要,需要对sql进行一些优化。刚刚工作的我对优化可是特别感兴趣,终于能学习到个不错的知识了,于是我跟着大佬的步伐,积累了一些简单的经验。
话不多说,马上进入正题,此次的优化查询主要是两张表,小表数据量可忽略不计,但是字段比较多,大表的话数据量达到了百万级别,用左关联,小表去关联大表的时候会出现查询效率低下,返回结果慢,于是根据仅有不多的知识去做了一些简单的优化,稍微会提升一下。
这是一开始查询的sql与时间
SELECT DISTINCT
*
FROM BG_order t1
LEFT JOIN exch_rate t2
ON t1.CURRENCY = t2.`FROM_CURR_CD`
AND t2.`TO_CURR_CD` = 'CNY'
AND t2.exch_rate_type_cd = 'Average'
AND t1.ORDER_CREATE_TIME = t2.`EXCH_RATE_DT`
在我们做查询的时候尽量不要去用 * ,要去用具体的字段,这里为了简介明了所以就用 * 来代替。
上面的sql很简单,BG_order(订单表)关联了exch_rate(汇率表),使CURRENCY(币种) =FROM_CURR_CD(来源币种),因为汇率表有大概十来年的历史,每个阶段的汇率又不相同,大概产生了100w的数据量,所以我们在这作了限制,限制下是何种币种以及订单表和汇率表中 的时间相同。
从下图中可以看出用时 总共用时以及 返回的结果,分别是172ms和 139条信息。
接着我们来看优化后的脚本,这里用子查询来进行优化,将限制条件放入子查询中,使得脚本先去选择范围再去查询。
这是优化后的sql
SELECT DISTINCT
*
FROM crmapp.BG_order t1
LEFT JOIN ( SELECT FROM_CURR_CD,EXCH_RATE_VAL,EXCH_RATE_DT
FROM crmapp.pt_exch_rate
WHERE TO_CURR_CD = 'CNY'
AND exch_rate_type_cd = 'Average') t2
ON t1.CURRENCY = t2.FROM_CURR_CD
AND t1.ORDER_CREATE_TIME = t2.`EXCH_RATE_DT`
这里我们用了一个简单的子查询,将限制条件放入了子查询select中,当作一个表t2 ,此时我们的查询效率就会快一些,并且返回的数据是相同的,如果我们在遇到数据量大的时候,关联子查询无非是一种不错的选择。
=&#