in notin exists not exists 性能优化算
in notin exists not exists 性能优化算法总结
- 1.1. in 和 exists 区别
- 1.2. not in 能不能走索引
- 1.3. not in 和 join 的关系
- 1.4. 和 not Exists 的关系
- 1.5. in 的实现过程
1.1. in 和 exists 区别
in 和exists 的区别是in 和exists 执行时,in 是先执行子查询中的查询,然后再执行主查询。而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询。
exists 和 in 在执行时效率单从执行时间来说差不多,exists要稍微优于in。在使用时一般应该是用exists 而不用in。
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
IN 不对NULL进行处理。
1.2. not in 能不能走索引
答案是有些可以有些不可以。
排除少量情况下 ,not in 基本就是等同遍历了。
如果排除上万数据,那走走索引还是有用的,排除的数据越多,走索引效果越好。具体的实现实现效果和数据库类型和版本相关。一般越高级数据库与版本会对此优化越好。。
如果遇到相关数据库对此语句优化不好,那就需要利用适当调整sql语句,换个等义的更高性能写法(一般可读性会因此下降) 或者利用存储过程自定义函数等自己实现性能高的notin算法,或者用编程语言实现
1.3. not in 和join 的关系
虽然not in 里面排除多的情况下可以走索引,但数据库具体实现可能没有实现,此时可以使用join 代替代价就是可读性相对会下降写。
优先使用not in,其次join 代替 可读性优先保证
1.4. 和 not Exists 的关系
含义上说 notin 基本就是notexist 也有可能是sql标准,待确定有可能不同的数据库
区分是为了实现俩种不同的查询算法 有些数据库俩种算法几乎一样效率,有些数据库实现的不一样。。
而且数据量大小不同的情况下,可能会走不同的路径,不能一概而论。。
1.5. in 的实现过程
用in 写出来的SQL 的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用in 的SQL 性能总是比较低的
从SQL执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:SQL试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。
可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功