mysql优化——子查询

本文探讨了MySQL中子查询的优化,包括将子查询限制条件移至内部、使用子查询替换连接以及将子查询重写为连接等方法,以提高查询效率。通过实例展示了如何将一个低效的左连接优化为子查询,从而减少查询时间。
摘要由CSDN通过智能技术生成

项目中有需要,需要对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 ,此时我们的查询效率就会快一些,并且返回的数据是相同的,如果我们在遇到数据量大的时候,关联子查询无非是一种不错的选择。
在这里插入图片描述

=&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值