zoukankan      html  css  js  c++  java
  • NOT EXISTS优化的一个案例 .

    原始语句:

    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
         );
    • 1
    • 1

    关于优化改语句的几点思考:
    对于原始语句,因为是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;
  • 相关阅读:
    C#与JS实现 获取指定字节长度 中英文混合字符串 的方法
    CKFinder_AspDotNet_2.4 破解方法 去版权
    MVC3中如何输出富文本
    CKEditor与CKFinder整合 MVC3
    vue项目多页配置
    设备宽度
    h5前端项目常见问题汇总
    react分享
    javascript-复制
    vue开发笔记
  • 原文地址:https://www.cnblogs.com/firstdream/p/5434049.html
Copyright © 2011-2022 走看看