当子查询的时候,使用EXISTS替代IN。
IN的使用频率很高,因为语义性很强,很好理解。但是可能成为查询的瓶颈,因为IN是执行的全表扫描,所以一般优化代码中含有IN的语句就能大幅度提高性能。
如果IN是数值列表,那么不需要过多注意,如果是子查询,就要进行优化。
为什么使用EXISTS优化?理由如下:
- 如果在关联列上建立了索引,那么查询子关联表的时候,不需要查询实际表,只需要查询索引即可。
- 使用EXISTS,只要查询一行满足条件就会终止查询。
IN是扫描全表。当IN子句是查询的时候,那么数据库会优先执行子查询,并且会将结果存在一张临时表中(内联视图),然后扫描整个视图。这种操作会非常消耗资源。
还有一种方式就是使用连接代替IN,但是大多数情况下EXISTS更好!