SQL执行效率优化

SQL 执行效率优化

一、避免使用SELECT *

  1. SELECT * 属于全表扫描,不利于提高查询效率。
  2. 如果本身只需要使用表中的几个字段,全量查询增大了使查询结果集,占用更多的数据库内存,增加数据库负担,甚至出现内存溢出。
  3. 除了对数据库增加了压力,对应用程序和网络也增加了压力。

因此,我们在查询时只查需要用到的列就可以了

1
2
3
4
5
--反例
SELECT * FROM Order where Id=1

--正例
SELECT Order_number,Userid FROM Order where Id=1

二、用UNION ALL代替UNION

众所周知,使用UNION ALL可以获取包含重复数据在内的所有数据。而使用UNION查询出的结果集,是经过了比较去重后的。

去重这个过程数据库需要将所有数据进行遍历比较,会增加查询的耗时。因此在确保两个数据集没有重复数据的情况下,使用UNION ALL是最优的。

1
2
3
4
5
6
7
8
9
--反例
SELECT Order_number,Userid FROM Order where Id<100
UNION
SELECT Order_number,Userid FROM Order where Id>200

--正例
SELECT Order_number,Userid FROM Order where Id<100
UNION ALL
SELECT Order_number,Userid FROM Order where Id>200

三、IN 与 EXISTS

IN适用于主表的数据量大于子表的情况,而EXISTS则相反。

两者的详细区别,可以看看这个博主的文章:

SQL 查询中 in 和 exists 的区别分析

1
2
3
4
5
6
7
8
9
--IN适用场景
SELECT Order_number,Userid FROM Order where Id IN(
SELECT * FROM UserBase WHERE ID<100
)

--EXISTS使用场景
SELECT * FROM UserBase A WHERE EXISTS (
SELECT Userid FROM Order B WHERE A.Userid=B.Userid
)

四、用连接查询代替子查询

子查询程序会先执行在嵌套在最内层的语句,再执行外层的语句。

执行时会自动创建临时表,查询完毕后会再删除这些临时表,有一些额外的性能消耗。在整体数据量较大的情况下,可以改成连接查询

1
2
3
SELECT * FROM Order A INNER JOIN UserBase B
ON A.Userid=B.Userid
WHERE B.Userid<1000
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Cooper
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信