`

mysql查询语句in和exists二者的区别和性能影响

阅读更多

还记得一次面试中被人问到in 和 exists的区别,当然只是草草做答,现在来做下分析。


mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
 

如果查询的两个表大小相当,那么用in和exists差别不大。 
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 
例如:表A(小表),表B(大表)
 
1:
select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;
 
select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。 
相反的
 
2:
select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;
 
select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。
 
 
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。 
in 与 =的区别 
select name from student where name in ('zhang','wang','li','zhao'); 
与 
select name from student where name='zhang' or name='li' or name='wang' or name='zhao' 
的结果是相同的。
分享到:
评论
1 楼 b_l_east 2017-09-12  
不一定哦,就算大小相当,in 和 exists的性能也会很大差别

相关推荐

    mysql多表查询和EXISTS查询性能对比

    ### MySQL多表查询和EXISTS查询性能对比 #### 测试环境 在进行MySQL多表查询与EXISTS查询的性能对比之前,首先需要了解测试环境的相关配置。虽然原文中并未给出具体的测试环境细节,但在实际操作中,这一步骤至关...

    in和exists的区别

    在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...

    in和exists的区别与执行效率问题解析

    标题和描述均聚焦于SQL查询语句中"IN"与"EXISTS"的区别及执行效率问题,这是一个在数据库操作中非常关键的话题,尤其对于优化查询性能有着不可忽视的作用。下面,我们将深入探讨这两种语句的不同之处及其对执行效率...

    in和exists性能解析

    在数据库查询语言中,`IN` 和 `EXISTS` 子句是两种常见的用于关联两个表的方法,它们各自有其独特的性能特点和适用场景。本文将深入解析Oracle中`IN`与`EXISTS`的性能差异,以及如何根据具体需求选择最合适的查询...

    sql in,exists,not in,not exists区别

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    SQL Exists语句的使用

    在SQL查询语句中,Exists语句的使用方式

    PostgreSQL IN vs EXISTS vs ANYALL vs JOIN性能分析

    在应用目标上,以pgbench_accounts和pgbench_branches为例,我们可以通过四种不同的方式编写查询语句:使用IN子句、使用ANY子句、使用EXISTS子句和使用INNER JOIN。每种方式都有其特点和适用场景。例如,当需要判断...

    MySQL中的in,exists,not in,not exists查询过程对比及结论

    MySQL优化之in,exists,not in,not exists的区别in与existsin查询过程结论:exists查询过程:结论:not in与not existsnot in查询过程:结论:not exists查询过程:结论: 首先我们使用两个用户表作为实例 insert ...

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    同时,EXISTS和NOT EXISTS也可以使查询语句变得更加简洁和易于理解。 总结 本文探讨了使用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句的优化方法。通过使用EXISTS和NOT EXISTS,我们可以提高查询的效率,避免了...

    Oracle和MySQL语句区别.doc

    Oracle和MySQL语句区别 Oracle和MySQL是两种常用的关系数据库管理系统,它们都使用SQL语言来管理和操作数据库。但是,Oracle和MySQL在语句上有许多不同之处。本文将对Oracle和MySQL语句的不同之处进行详细的比较和...

    MySQL exists 和in 详解及区别

    MySQL中的`EXISTS`和`IN`都是在SQL查询中用来检查特定条件是否存在的子查询操作符,但它们的工作方式和适用场景有所不同。下面将详细解释这两个操作符的用法和区别。 ### `EXISTS`操作符 `EXISTS`主要用于判断子...

    mySQL中in查询与exists查询的区别小结

    MySQL中的`IN`查询和`EXISTS`查询都是在处理子查询时常用的操作,它们各自有不同的特性和适用场景。理解两者的区别对于优化SQL查询性能至关重要。 ### `IN`查询 `IN`查询通常用于检查某列的值是否在特定的值列表中...

    mysql 查询语句学生表、课程表、 成绩表、教师表.docx

    MySQL 查询语句学生表、课程表、成绩表、教师表 本文档提供了 50 个常用的 SQL 语句,涵盖学生表、课程表、成绩表、教师表等多个方面。这些语句可以帮助开发者快速掌握 MySQL 查询语句的编写,提高开发效率。 1. ...

    搞懂mysql的exists

    MySQL中的`EXISTS`子句是SQL查询语句中一种重要的条件判断操作,它用于测试子查询是否返回至少一行数据。在理解`EXISTS`的使用时,我们需要深入探讨其工作原理、优缺点以及与其他查询操作(如`IN`、`JOIN`)的对比。...

    对比分析MySQL语句中的IN 和Exists

    本文将深入探讨 `IN` 和 `EXISTS` 在MySQL中的差异,通过实验数据和执行计划分析它们的性能。 首先,理解 `IN` 和 `EXISTS` 的基本概念。`IN` 通常用于检查某个值是否在一系列值的列表中,而 `EXISTS` 则用来检查子...

    基于MySQL数据库的查询性能优化研究.pdf

    3. 优化查询语句:优化查询语句,例如使用 EXISTS 语句代替 IN 语句、避免使用HAVING 子句等。 4. 使用缓存机制:使用缓存机制可以大大提高查询速度,例如使用 MySQL 的查询缓存机制等。 提高 MySQL 数据库的查询...

    sql case when exists not exists in not in

    而`IN`和`NOT IN`在处理简单条件时较为直观,但如果与子查询结合,可能会导致全表扫描,影响性能。 在进行SQL晋级学习时,理解并熟练掌握这些操作符的用法至关重要。通过不断地实践和优化,能够编写出更高效、更...

Global site tag (gtag.js) - Google Analytics