sql语句优化之用EXISTS替代IN、用NOTEXISTS替代NOTIN的语句
SQL 优化 语句 in 替代 exists 之用 NOTIN
2023-06-13 09:13:57 时间
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
如
我要查询 Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据)
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序执行时间:40109.38毫秒
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序执行时间:8531.25毫秒
很明显使用not EXISTS效率高多了
如
我要查询 Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据)
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序执行时间:40109.38毫秒
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序执行时间:8531.25毫秒
很明显使用not EXISTS效率高多了
相关文章
- 常见SQL面试题_sql索引面试题
- 最完整的Explain总结,SQL优化不再困难
- SQL开发知识:关于表oracle的一些特殊查询sql语句
- MySQL Error number: 4018; Symbol: ER_CANT_SET_ANONYMOUS_TO_GTID_AND_WAIT_UNTIL_SQL_THD_AFTER_GTIDS; SQLSTATE: HY000 报错 故障修复 远程处理
- sql server 性能优化之nolock
- 如何优化sql中的orderBy语句
- SQL优化大全详解数据库
- 操作MySQL数据库:操作SQL语句必备技能(mysql数据库sql语句)
- 优化Oracle SQL优化:提升性能的先进方法(oracle当前sql)
- MySQL查询功能:学会使用SQL语句(mysql查询sql语句)
- Mysql 中使用自增 SQL 语句实现自动编号(mysql自增sql语句)
- Oracle 中优化SQL性能的终极指南(oracle中sql优化)
- MySQL命令运行SQL语句实战指南(mysql命令运行sql)
- MySQL如何修改SQL语句?(mysql修改sql)
- MySQL如何有效防止SQL注入攻击?(mysql防sql注入)
- MySQL学习:拼接SQL语句的技巧(mysql拼接sql)
- 清空MySQL表的Effortless SQL语句(mysql清空表sql)
- MySQL数据库的SQL语句执行过程(mysql执行sql)
- 从SQL格式数据快速导入MSSQL数据库(sql格式导入mssql)
- 快速高效的MSSQL导入SQL方法,让数据转移无压力。(mssql导入sql)
- SQL Server节点优化:能让你获取更多的性能提升(sqlserver 节点)
- 池SQL Server极致优化:线程池技术实践(sqlserver 线程)
- SQL Server子表查询:优化数据库性能(sqlserver 子表)
- SQL Server五笔输入法性能优化(sqlserver五笔)
- MSSQL中最佳的SQL语句编写技巧(sql mssql 语句)
- 语句MS SQL:每条SQL语句都有其特殊意义(mssql 每条sql)
- sql学习使用LR分析Oracle SQL语句的完美指南(lr 写oracle)
- 优化效率,合并SQL语句MySQL查询优化技巧之两次查询合并(mysql 两次查询合并)
- MySQL数据库SQL语句指南(mysql下sql语句)
- Oracle中SQL参数优化实践经验(oracle中sql参数)
- 优化深入探究Oracle下的SQL优化之道(oracle下sql)
- 从Oracle数据库查重SQL技巧介绍(oracle sql查重)
- 优化oracle sql性能改写有效果(oracle sql改写)
- 查询快速精准查询Oracle SQL语句(oracle sql快捷)
- Oracle SQL分行技能实现高效管理(oracle sql分行)
- 如何优化SQL语句的心得浅谈