淘先锋技术网

首页 1 2 3 4 5 6 7

一、概述

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

(九)合理使用存储结构