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'
的结果是相同的。
相关推荐
本文立足于SQL语言及对数据库多种操作方式的分析基础上,深入探讨了数据库SQL查询处理的基本内容与流程,并详细研究了几种SQL查询优化策略,包括索引查询、SQL语句优化以及其他常见优化方法。 #### 关键词 - 数据库...
SQL(Structured Query Language)是一种用于管理关系数据库...合理地使用不同的谓词,可以更精确地筛选出所需的数据,提高查询效率,优化数据库操作。在复杂的SQL查询中,谓词的正确使用是掌握SQL高级查询技巧的关键。
- **动态分层**:一种用于自动管理数据存储层的技术,根据数据的访问频率将数据存储在不同层级上,以实现更高的存储效率和性能。 #### 四、总结 SAP HANA SQL 和系统视图参考为开发者提供了全面的 SQL 语言使用指南...
一般来说,当T1的数据量远小于T2时,EXISTS的效率更高,反之,当T1的数据量远大于T2时,IN的效率更优。 MINUS关键字用于在两个查询结果之间找到差异,返回的结果是只存在于第一个查询中的行。需要注意的是,MINUS...
在WHERE子句中使用NOT操作符时需谨慎,尤其是与IN或EXISTS结合使用时。不当的使用可能会导致优化器选择次优的执行计划,影响查询性能。考虑使用更直接的比较条件替换复杂的NOT表达式,或调整查询结构以提升效率。 ...
使用`NOT EXISTS`通常比`NOT IN`+子查询更高效,特别是在子查询返回多行的情况下。 **3-5、用表连接替换EXISTS** 当查询涉及多个表时,使用表连接而非`EXISTS`通常更为高效。 **3-6、尽量不使用HAVING子句** ...
全文索引在MyISAM存储引擎中得到支持,而在较新的MySQL 5.6及更高版本中,InnoDB存储引擎也开始支持全文索引。 创建全文索引通常需要以下几个步骤: 1. **设置全文索引**:在MySQL管理工具中,可以找到相应的选项...