sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT
在众多的基础表查询中,我们经常面临一种情况:为了满足某个条件,需要关联另一张表。此刻,采用EXISTS或NOT EXISTS会大大提升查询的效率。子查询中的NOT IN子句,虽然看似方便,实则内部会进行排序和合并,因此效率相对较低。这是因为NOT IN会对子查询中的整张表进行遍历。
举个例子,假设我们需要查询Sendorder表中的冗余数据,即那些没有与reg_person或worksite表相关联的数据。我们使用了NOT IN子句来编写一个SQL查询:
```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;
```
这种优化背后的逻辑在于,EXISTS和NOT EXISTS在数据库优化器中可以更好地利用索引,避免全表扫描,从而提高查询效率。而当我们使用NOT IN时,数据库可能需要遍历整个子查询结果集,这无疑增加了处理时间。
在处理这类查询时,合理利用EXISTS和NOT EXISTS,可以显著提高查询效率,优化数据库性能。
编程语言
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT
- 通过Ajax手动解决WordPress WP-PostViews不计数的问题
- JavaScript中Function()函数的使用教程
- MySQL中sleep函数的特殊现象示例详解
- javascript基于牛顿迭代法实现求浮点数的平方根【
- ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决
- 基于cssSlidy.js插件实现响应式手机图片轮播效果
- CentOS7中源码编译安装NodeJS的完整步骤
- 关于NodeJS中的循环引用详解
- JS字符串按逗号和回车分隔的方法
- destoon实现调用图文新闻的方法
- XML指南——XML CDATA
- Codeigniter生成Excel文档的简单方法
- ASP.NET 后台登录小技巧介绍
- php sybase_fetch_array使用方法
- Jquery遍历select option和添加移除option的实现方法