not in效率低(MYSQL的Not IN、not EXISTS如何优化)

这篇具有很好参考价值的文章主要介绍了not in效率低(MYSQL的Not IN、not EXISTS如何优化)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】
  • 【创作不易,点个赞就是对我最大的支持】

前言

仅作为学习笔记,供大家参考
总结的不错的话,记得点赞收藏关注哦!

原SQL使用的是NOT IN

       select a.id, b.messageId, a.sourceTypeId, a.title, a.messageTime, a.depId, a.status, b.setMark, b.msgType, b.msgRemarks
      from t_sync_data a left join t_message_seting b on a.id = b.messageId where exists (select 1 from t_sync_data where depId=136 and
        status!=4 and status!=2 and status!=5)
        <if test="messageIds != null and messageIds.size() >0"> and a.id NOT IN
            <foreach item="messageId" collection="messageIds" open="(" separator="," close=")">
                #{messageId}
            </foreach>
        </if>
       order by a.messageTime desc, a.id desc, a.status

原因分析:我用了两条sql来解决,第一条sql去查了一组id来排除数据,导致每次查询都要去遍历
建议:能用1条sql出来还是用一条会更快,尽量不要用IN 、NOT IN
1、用 EXISTS 或 NOT EXISTS 代替
2、用JOIN 代替
这里我只查子表主表都存在的数据,故用了内连接,也可以用右连接,需求是以副表为主

新SQL使用的是NOT EXISTS

这里要注意一下:not exists子查询要加一个条件:messageId=a.id 和外边的表关联起来,否则是查不到数据的

select a.id, b.messageId, a.sourceTypeId, a.title, a.messageTime, a.depId, a.status, b.setMark, b.msgType, b.msgRemarks
        from t_sync_data a inner join t_message_seting b on a.id = b.messageId where a.depId=136 and  a.status!=4 and a.status!=2 and a.status!=5
        and not EXISTS (select id
        from t_message_task WHERE  messageId=a.id
        <if test="depId != null ">and depId = #{depId}</if>
         )
        order by a.messageTime desc, a.id desc, a.status 

结果:效率提升十倍不止

创作不易,点个赞就是对我最大的支持~


wxgzh:程序员温眉

CSDN:程序员温眉

每天进步一点点的程序员文章来源地址https://www.toymoban.com/news/detail-664847.html

到了这里,关于not in效率低(MYSQL的Not IN、not EXISTS如何优化)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL in和exists的取舍

    之前说过要小表驱动大表,即先遍历小表再遍历大表,接下来看一下in和exists的区别 in 先执行子查询,适合于外表大而内表小的情况 in的参数是子查询时,会将子查询结果存储在一张临时的表中(内联视图),然后扫描整个视图 exists 以外层表作为驱动表,外层表先被访问,适合

    2024年01月23日
    浏览(46)
  • MySQL EXISTS 语句和IN语句有啥区别

    在 MySQL 中,`EXISTS` 和 `IN` 是用于子查询的两种不同方式,它们有一些区别: 1. **IN 语句**:    - `IN` 子句用于在 WHERE 子句中指定多个值,并检查主查询中的某个列是否在子查询返回的结果集中。    - `IN` 子句适用于子查询返回单列多行结果的情况。    - `IN` 子句通常在子查

    2024年04月11日
    浏览(52)
  • MySQL中的in+子查询应该如何优化

    ☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅📅📅面经分享(牛客主页):传送门 🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正! 📜 如果觉得内容还不错,欢迎点赞收藏关注哟!

    2024年01月19日
    浏览(45)
  • 出现以上报错:Could not find artifact mysql:mysql-connector-java:pom:8.0.35 in alimaven

    代表在maven仓库没有找到对应版本的MySQL 如果你这里是导入其他包建议去找maven仓库直接搜索 链接 仓库服务 (aliyun.com) 在箭头处输入你的包名 这样问题就解决了

    2024年02月04日
    浏览(48)
  • Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven解决及分析

    创建springboot项目,勾选数据库驱动 springboot版本为2.7.0 Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven 解决方法就是给mysql-connector-j指定版本 注意点:使用8.0+版本的mysql驱动,后续在application.yaml中配置driver时要加cj 6.0以上的mysql驱动,jdbc.driver为com.mysql.

    2024年02月16日
    浏览(60)
  • 【解决】Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven解决及分析

    创建springboot项目,勾选数据库驱动 springboot版本为2.7.0 Maven报错Could not find artifact com.mysql:mysql-connector-j:pom:unknown in aliyunmaven 解决方法就是给mysql-connector-j指定版本 注意点:使用8.0+版本的mysql驱动,后续在application.yaml中配置driver时要加cj 6.0以上的mysql驱动,jdbc.driver为com.mysql.

    2024年02月07日
    浏览(46)
  • MySQL 出现 which is not functionally dependent on columns in GROUP BY clause;解决方法

    项目跑到一个新服务器上保存了 一个新安装的数据库,出现了问题 具体报错信息如下: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘aigcc.t2.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 问题出现在grou

    2024年02月08日
    浏览(49)
  • Could not find artifact mysql:mysql-connector-java:pom:unknown in central (https://repo.maven.apache

    报错原因:Could not find artifact mysql:mysql-connector-java:pom:unknown in centra 解决方法: 在pom.xml文件中指定你的mysql版本。 dependency         groupIdmysql/groupId         artifactIdmysql-connector-java/artifactId         version5.1.43/version         scoperuntime/scope /dependency

    2024年02月13日
    浏览(59)
  • IDEA报错:Could not find artifact mysql:mysql-connector-java:pom:unknown in central (https://repo.maven

    IDEA 运行报错:Could not find artifact mysql:mysql-connector-java:pom:unknown in central (https://repo.maven.apache.org/maven2) 报错原因:Maven 找不到mysql 解决方案:由于之前IDEA dependency mysql: dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency 修改:在pom.xml文件中指定你的mysql版本。

    2024年02月13日
    浏览(55)
  • Spark SQL优化:NOT IN子查询优化解决

    文章最前 : 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。  相关文章: LEFT ANTI JOIN的使用

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包