NOT EXISTS的优化

参考博文:http://blog.csdn.net/zyz511919766/article/details/49335647

原来的SQL

SELECT *
  FROM T_SOF_IMP a
 WHERE not exists (select 1 from t_sof_subscriber b where a.dn=b.dn);

优化之后的SQL

select a.*
from T_SOF_IMP a
left join T_SOF_SUBSCRIBER b
on a.dn = b.dn
where b.dn is null;

博文的具体内容如下:

原始语句:

1
SELECT
2
*
3
FROM
4
dcf_account.t_posting_transaction t1
5
WHERE
6
NOT EXISTS (
7
SELECT
8
*
9
FROM
10
dcf_loan.t_account_posting_detail t2
11
WHERE
12
t1.track_no = t2.posting_num
13
);
关于优化改语句的几点思考:
对于原始语句,因为是NOT EXISTS判断,所以子查询中没有必要SELECT ,只需SELECT ID甚至是SELECT 1都可以。另外,鉴于MySQL子查询算法性能较差,考虑改写成对应的JOIN方式,因为这里是NOT EXIST判断,所以改写时有一定技巧,即可使用左连接,然后过滤出未能成功连接的记录。还有,原始语句最外层的查询也是SELECT 至于这个是否有必要应当依据具体业务,尽量在满足业务要求的条件下取尽可能少的字段。最后,即时做了上述优化,若在连接条件上没有合适的索引SQL性能仍然会非常差(特别是在表的数据量巨大的时候),所以考虑在连接的条件列t1.track_no 和 t2.posting_num上分别创建索引。
最终的优化结果如下
语句由原来的进一个小时的运行时间减少到1秒内。

1
SELECT
2
t1.id
3
FROM
4
dcf_account.t_posting_transaction t1
5
LEFT JOIN dcf_loan.t_account_posting_detail t2 ON t1.track_no = t2.posting_num
6
WHERE
7
t2.id IS NULL;

转载于:https://www.cnblogs.com/yldf/p/7736374.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值