1.in和exists
  in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。    

  exists()后面的子查询被称做相关子查询,它和in查询不同,in()后面的子查询 是返回结果集的;而exists是不返回列表的值的,只是返回一个ture或false,也就是说exists判断子查询的结果是不是存在,但并不关心查到的是什么结果,是什么字段(这也是为什么子查询里经常会有"select 1"或select数字的原因);

  其实我们区分in和exists,还有一种理解就是通过驱动顺序,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了;

exists执行顺序:

  • 首先执行一下外部查询;
  • 对于外部查询的每一行分别执行一次子查询,返回一个逻辑值true或者false;
  • 根据子查询返回的逻辑结果来确定主查询的结果集;

  如果两个表中一个是小表,一个是大表,则子查询表大的用exists,子查询表小的用in效率高点:
例如:表A(小表),表B(大表)

(1). select * from A where cc in (select cc from B)
-- 效率低,用到了A表上cc列的索引;
(2). select * from A where exists(select cc from B where cc=A.cc)
-- 效率高,用到了B表上cc列的索引。 -- 相反的
(3). select * from B where cc in (select cc from A)
-- 效率高,用到了B表上cc列的索引;
(4). select * from B where exists(select cc from A where cc=B.cc)
-- 效率低,用到了A表上cc列的索引。

2. not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exists 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

3. 如果查询的两个表大小相当,那么用in和exists差别不大。

4. 总结:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

参考:http://bbs.csdn.net/topics/310148714

http://bbs.csdn.net/topics/350022037?list=lz

MySQL-IN和Exists区别的更多相关文章

  1. mysql in与exists区别

    1.exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的 ...

  2. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  3. MySQL 子查询 EXISTS 和 NOT EXISTS(转)

    MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE EXISTS ...

  4. 查询优化--小表驱动大表(In,Exists区别)

    Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批 ...

  5. mysql 不同索引的区别和适用情况总结

    最近在做sql优化,看到一篇有关sql索引不错的文章,转载一下. 一.索引类型 普通索引:INDEX 允许出现相同的索引内容 (normal) 唯一索引:UNIQUE 不可以出现相同的值,可以有NUL ...

  6. MySQL与MongoDB的区别

    一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨 ...

  7. mysql和mysqli的区别

    看书.看视频的时候一直没有搞懂mysqli和mysql到底有什么区别.于是今晚“谷歌”一番,整理一下.需要的朋友可以参考下.   一: PHP-MySQL 是 PHP 操作 MySQL 数据库最原始的 ...

  8. PHP数据库连接mysql与mysqli的区别与用法

    一.mysql与mysqli的概念相关: 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库 ...

  9. SQL Server,MySQL,Oracle三者的区别

    SQL Server,MySQL,Oracle三者的区别 2016-10-14 转自:SQL Server,MySQL,Oracle三者的区别 目录 1 Oracle.Sql Server.MySql ...

  10. 转载文章 MySQL与Oracle的区别

    MySQL与Oracle的区别   1.  Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高 ...

随机推荐

  1. [BZOJ4553][HEOI2016]序列 CDQ分治

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小伙 ...

  2. Linux 内核分析第八周学习笔记

    Linux 内核分析第八周学习笔记 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  3. HDU.1846 Brave Game (博弈论 巴什博弈)

    HDU.1846 Brave Game (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 include <bits/stdc++.h> using namespac ...

  4. 用Visual C#开发基于OpenCV的Windows应用程序

    http://blog.163.com/wangxh_jy/blog/static/28233883201001581640283/ 关于详细的配置及程序运行截图,请下载:http://downloa ...

  5. 嘘,如何激活更新的win10

    win10更新了,所以很坑的是以前的密钥又不管用了,系统和office都要重新激活,然而微软的更新就是很有恶意的,总之成功率堪忧. 还好看到了万能的网友的办法. slmgr.vbs /upk slmg ...

  6. HDU 4584 splay

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  7. 我是大SB

    哈哈哈 我就是个大SB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  8. ubuntu下MySQL的安装与卸载

    1. 删除mysql a. sudo apt-get autoremove --purge mysql-server-5.0 b. sudo apt-get remove mysql-server c ...

  9. (转)javap 指令集

    栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型 ...

  10. ndk如何将代码放在jni之外

    LOCAL_PATH := $(call my-dir)SDK_PATH := ../../.. include $(CLEAR_VARS)LOCAL_MODULE := libiconv_stati ...