一、概述
sql的性能优化是数据库工程师在实际工作中必须掌握的重要课题之一,随着现在的互联网发展,后台工程师也要全面掌握SQL的性能优化。实际上在我们项目中,SQL的性能是决定你这个系统的可用性。下面就有我为大家其几点意见,本次不针对某一个数据库:
(一)子查询优化
1. 在子查询中我们可以将 In 替换为 exists
2. 在子查询中我们还可以将 In 替换为 inner join
(二)集合运算符避免排序
集合运算符:UNION , INTERSECT , EXCEPT,这些运算符在使用的过程中都是去掉重复数据排序。如果不在乎排序和重复数据,我们可以全部加上ALL,就比如这样使用:UNION ALL, INTERSECT ALL, EXCEPT ALL 来代替 UNION , INTERSECT , EXCEPT 这样就不需要排序和去重从而提高效率。
(三)使用EXISTS代替DISTINCT
distinct也会排序从而降低效率,我们可以使用exists代替,他是不会排序的。
(四)在极值函数中使用索引
1. 极值函数: min/max
2.如果不加索引的话,会扫描全表,如果添加索引将会扫描索引
(五)能写在where张的条件不要写在having中
1. 如果在后面有 group by 或者 order by , 我推荐使用wehre ;
原因是使用where之后 group by 和 order by 会在筛选条件后分组和排序;
使用having是不会的,原因是having是根据聚合后的试图筛选的,很多时候聚合后的视图是没有继承原表的孙银结构。
(六)*索引计算的坑
1. 假设有一张表,索引字段为 age
select * from table1 where age * 1.1 > 100;
上面两个sql其实都没用到索引,还是全表扫描,那我们来优化一下sql
select * from table1 age > 100 / 1.1;
这样写就用到了索引
2. 索引无法使用的集中情况
(1)查询条件左侧使用函数
(2)使用 is null 和 is not null
(3)使用否定形式:<> 、 != 、 not in
(4)使用 or
3. 合理使用索引
在合适的字段上添加索引,因为索引大小一般是数据的三分之一 ,再加上索引要加载进内存的,如果全部字段都加索引会以牺牲内存为代价的;也会对insert update delete的执行速度大大减低,所以帮我们建立合理的索引。
(七)减少中间表
1. 灵活使用having子句
2.要用字段多个In时,我们这样写:
select * from table1 where
age in (select age in table2)
and name in (select age in table2)
我们可以写成这样
select * from table1 where
age || name in (select age || name in table2)
或者
select * from table1 where
(age , name) in (select age , name in table2)
(八)合理使用视图
如果没有深入的思考定义复杂的视图,会带来巨大的性能问题,在视图中使用下面运算的时候效率非常低
聚合函数:AVG,COUNT,SUM,MIN,MAX
集合运算符:UNION,IINTERSECT,EXCEPT