当前位置:Gxlcms > 数据库问题 > (转)MySQL中In与Exists的区别

(转)MySQL中In与Exists的区别

时间:2021-07-01 10:21:17 帮助过:25人阅读

* from user where exists select * from user); #等价于 select * from user where exists (select 1);

 

in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后再将子查询条件的结果集分解成m个,再进行m次查询。

  1. <span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> <span style="color: #ff00ff;">user</span> <span style="color: #0000ff;">where</span> <span style="color: #ff00ff;">user_id</span> <span style="color: #808080;">in</span> (<span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #800000; font-weight: bold;">2</span>, <span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">);
  2. #等效于
  3. </span><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> <span style="color: #ff00ff;">user</span> <span style="color: #0000ff;">where</span> <span style="color: #ff00ff;">user_id</span> <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">1</span> <span style="color: #808080;">or</span> <span style="color: #ff00ff;">user_id</span> <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">2</span> <span style="color: #808080;">or</span> <span style="color: #ff00ff;">user_id</span> <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">3</span>;

 

因为索引,in主要用到了外表的索引,exist用的是子查询的索引

5.5以后的MySQL版本在exists匹配查询结果时使用的是Block Nested-Loop(Block嵌套循环,引入join buffer,类似于缓存功能)开始对查询效率产生显著影响,尤其针对<font color=red>子查询结果集很大</font>的情况下能显著改善查询匹配效率:

通过以上分析,很容易得出下面的结论:

  • IN查询在内部表和外部表上都可以使用到索引;
  • Exists查询仅在内部表上可以使用到索引;
  • 子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block 嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN。
  • 子查询结果集较小,而外部表很大的时候,Exists的Block嵌套循环优化效果不明显,IN 的外表索引优势占主要作用,此时IN的查询效率会优于Exists。
  • 网上的说法不准确,即表的规模不是看内部表和外部表,而是外部表和子查询结果集。
  • 最后一点,也是最重要的一点:世间没有绝对的真理,掌握事物的本质,针对不同的场景进行实践验证才是最可靠有效的方法。

MySQL(七)|MySQL中In与Exists的区别(1)

MySQL(八)|MySQL中In与Exists的区别(2)

 

(转)MySQL中In与Exists的区别

标签:效果   strong   重要   判断   可靠   href   lock   相关   掌握   

人气教程排行