![06954a0d4eda081772f28de40696340c.png](https://i-blog.csdnimg.cn/blog_migrate/31110d321c455a2d3b2fc9074be65e59.jpeg)
SQL 的性能优化是数据库工程师在实际工作中必须面对的课题之一。对于某些数据库工程师来说,它几乎是唯一的课题。实际上,在像 Web 服务这样需要快速响应的应用场景中,SQL 的性能直接决定了系统是否可以使用。在 SQL 中,很多时候不同代码能够得出相同结果。从理论上来说,得到相同结果的不同代码应该有相同的性能,但遗憾的是,查询优化器生成的执行计划很大程度上要受到代码外部结构的影响。因此如果想优化查询性能,必须知道如何写代码才能使优化器的执行效率更高。
一、使用高效查询
1.1 参数是子查询时,使用 EXISTS 代替 IN
在大多时候,[NOT] IN 和 [NOT] EXISTS 返回的结果是相同的。但是两者用于子查询时,EXISTS 的速度会更快一些。
如下两张表中包含了选课程 A 和课程 B 的学生。
![15b35da0bd3f56a8a4231cc467cf0b9a.png](https://i-blog.csdnimg.cn/blog_migrate/0518addc46b4f19154a835da8c1aac0a.png)
![cbb1850e39d8a1e233d78e72c74d2dab.png](https://i-blog.csdnimg.cn/blog_migrate/cd42d8b155c141ef381e56821867ee85.png)
从 class_A 表中找出同时选了课程 B 的学生。
-- slow
使用 EXISTS 时更快的原因有以下两个。
- 如果连接列 (id) 上建立了索引,那么查询 class_B 时不用查实际的表,只需查索引就可以了。
- 如果使用EXISTS,那么只要查到一行数据满足条件就会终止查询,不用像使用 IN 时一样扫描全表。在这一点上 NOT EXISTS 也一样。
当 IN 的参数是子查询时,数据库首先会执行子查询,然后将结果存储在一张临时的工作表里(内联视图),然后扫描整个视图