zoukankan      html  css  js  c++  java
  • MySQL中Exists和In的使用

    Exists关键字:

    exists表示存在,是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的使用exists,可加快效率;它常常和子查询配合使用,例如下面的SQL语句

    SELECT * FROM `user` WHERE exists (SELECT * FROM `order` WHERE user.id = order.user_id)

    exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。

    当子查询返回为真时,则外层查询语句将进行查询。

    当子查询返回为假时,外层查询语句将不进行查询或者查询不出任何记录

    In关键字:

    in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。

    SELECT * FROM `user` WHERE id in (SELECT user_id FROM `order`)

    in()语句只会执行一次,它查出order表中的所有user_id字段并且缓存起来,之后,检查user表的id是否和order表中的user_id相当,如果相等则加入结果期,直到遍历完user的所有记录。

    如果用not in ,则是内外表都全表扫描,无索引,效率低,可考虑使用not exists,也可使用A left join B on A.id=B.id where B.id is null 进行优化。

     总结:

    内表数据大的使用exists,外表数据大的使用in;

    参考:

    MySQL中exists和in的区别及使用场景

    https://www.cnblogs.com/xiaoxiong-kankan/p/7928153.html

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    DNN SEO专题 (收集)
    DataTable或者DataSet匯出Excel
    用C#制作PDF文件全攻略(转)
    BlogEngine资料收集
    DNN架构解析(收集)
    Community Server:快速找到需要修改的文件[技巧]
    通用的分页存储过程
    DataTable/DataSet汇出Excel
    百试不爽的30条职场经验(转)
    等宽字体
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12345625.html
Copyright © 2011-2022 走看看