项目的sql用到了not exist 查询,但是效率较低,于是找到了一种较为高效的方法,原文如下:

SELECT
     *
FROM
     dcf_account.t_posting_transaction t1
WHERE
     NOT EXISTS (
          SELECT
               *
          FROM
               dcf_loan.t_account_posting_detail t2
          WHERE
               t1.track_no = t2.posting_num
     );

关于优化改语句的几点思考:
对于原始语句,因为是NOT EXISTS判断,所以子查询中没有必要SELECT ,只需SELECT ID甚至是SELECT 1都可以。另外,鉴于MySQL子查询算法性能较差,考虑改写成对应的JOIN方式,因为这里是NOT EXIST判断,所以改写时有一定技巧,即可使用左连接,然后过滤出未能成功连接的记录。还有,原始语句最外层的查询也是SELECT 至于这个是否有必要应当依据具体业务,尽量在满足业务要求的条件下取尽可能少的字段。最后,即时做了上述优化,若在连接条件上没有合适的索引SQL性能仍然会非常差(特别是在表的数据量巨大的时候),所以考虑在连接的条件列t1.track_no 和 t2.posting_num上分别创建索引。

最终的优化结果如下
语句由原来的进一个小时的运行时间减少到1秒内。

SELECT
     t1.id
FROM
     dcf_account.t_posting_transaction t1
LEFT JOIN dcf_loan.t_account_posting_detail t2 ON t1.track_no = t2.posting_num
WHERE
     t2.id IS NULL;


版权声明:本文为CSDN博主「zyz511919766」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyz511919766/article/details/49335647

最后修改于 2020-02-13 14:04:04
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇