今天注意到,公司的代码里经常用到exists这个用法。也许个人习惯不一样吧,测试了下性能。对比下,这三种效率上的区别。
mysql> select SQL_NO_CACHE count(*) from test1 where id not in(select id from test2);
+----------+
| count(*) |
+----------+
| 215203 |
+----------+
1 row in set (5.81 sec)
mysql> select SQL_NO_CACHE count(*) from test1 where not exists (select * from test2 where test2.id=test1.id);
+----------+
| count(*) |
+----------+
| 215203 |
+----------+
1 row in set (5.25 sec)
mysql> select SQL_NO_CACHE count(*) from test1 left join test2 on test1.id=test2.id where test2.id is null;
+----------+
| count(*) |
+----------+
| 215203 |
+----------+
1 row in set (4.63 sec)
结论:生产环境里,应尽量避免使用子查询,用left join表连接取代之。
分享到:
相关推荐
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt欢迎下载!
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...
SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句2.txt,欢迎下载!
通过对比分析 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 以及不同类型的连接操作,我们可以发现不同的查询策略在不同的应用场景下具有不同的优劣性。选择合适的查询方式不仅能够提高查询效率,还能够节省系统资源,...
NOT EXISTS 是另一种排除条件查询的方式,其逻辑与NOT IN类似,但在某些情况下性能更优。NOT EXISTS 的SQL语法如下: ```sql SELECT * FROM tableA WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE tableA.id = ...
如果你想要查询在主表中不存在于子查询结果中的记录,使用 `NOT EXISTS` 可能比使用 `LEFT JOIN` 或 `NOT IN` 更直观。 - 使用场景:`EXISTS` 常用于检查关联或匹配的记录,而 `NOT EXISTS` 用于排除这些匹配的记录...
这是因为`IN`和`NOT IN`需要将主查询中的每一行都与子查询结果进行比较,而`EXISTS`和`NOT EXISTS`则只需判断子查询是否返回至少一行数据即可,无需获取所有数据行。 **性能对比:** - **IN 和 NOT IN**:需要将主...
它通常与 NOT EXISTS 结合使用,用于优化查询性能。 ```sql SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.common_column = table2.common_column); ``` 这将返回`table1`中存在与`...
12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况下推荐使用`NOT EXISTS`。 13. **使用EXISTS代替子查询**: - 与普通的子查询相比,使用`EXISTS`可以...
对于`IN`和`NOT IN`,应尽可能使用`JOIN`、`EXISTS`或结合空值判断的替代方法,以充分利用索引并减少不必要的计算步骤,从而提高查询速度和系统整体性能。在编写SQL时,不仅要考虑语句的可读性和简洁性,还要兼顾...
在理解`EXISTS`的使用时,我们需要深入探讨其工作原理、优缺点以及与其他查询操作(如`IN`、`JOIN`)的对比。 一、`EXISTS`的基本用法 `EXISTS`子句通常与子查询一起使用,形式如下: ```sql SELECT column1, ...
在很多情况下,可以通过使用 `INNER JOIN` 或 `LEFT JOIN` 替换 `EXISTS` 来简化查询,同时保持相同的逻辑结果。这种方法不仅可以减少嵌套,还能提高查询性能。 ```sql SELECT database_items FROM database_...
LEFT JOIN的常见问题主要包括性能和结果不准确性。在大数据量下,JOIN操作可能导致显著的性能下降,尤其是当连接条件不是索引时。解决这种问题的方法包括优化查询语句、创建合适的索引以及使用临时表或子查询。 另...
- `LEFT JOIN`与`IS NULL`的组合可以用来找出不在右表中的左表记录,而`NOT EXISTS`则可以更加灵活地处理这种情况。 - `NOT IN`与`NOT EXISTS`在某些场景下可以互换,但`NOT EXISTS`在处理空值时更可靠,且在某些...
例如,使用NOT IN或NOT EXISTS时,可以考虑改写为LEFT JOIN或NOT JOIN的形式,这通常能提供更好的执行计划,减少不必要的数据处理。 总的来说,Oracle编程时应注重事务管理,避免无谓的commit,充分利用绑定变量以...
理解`EXISTS`和`NOT EXISTS`的用法对于优化SQL查询非常重要,因为它们通常比使用`IN`或`JOIN`操作符更有效率,特别是在处理大量数据时。`EXISTS`主要关注记录是否存在,而不需要返回具体的值,这使得它在处理复杂...
在Oracle数据库中,`IN`和`EXISTS`都是用于子查询的比较操作符,但它们在执行方式和性能上存在显著差异。许多人误以为`EXISTS`总是比`IN`更快,但实际情况并非如此,具体表现取决于数据的分布和索引的利用。 1. **...
这里,我们在子查询中明确排除了`NULL`值,确保`NOT IN`操作只对比非`NULL`的值。 这两种方法都能有效地避免`NULL`值导致的错误,并且能正确地计算出`t1`中在`t2`中没有对应记录的条数。 在进行SQL查询优化时,...
在优化这类查询时,同样可以利用转换来提高效率,例如将NOT IN替换为LEFT JOIN和NULL检查,或者将NOT EXISTS替换为OUTER JOIN。 此外,标量子查询(Scalar Subquery)在SQL等价改写中也有重要作用,它可以用于表示...