优化类

慢SQL优化

2019-07-07  本文已影响0人  来杯熊酱不加糖

前言

        慢SQL会增加数据库压力,影响系统的访问速度及用户体验。

影响查询效率的因素

1、全表扫描。

2、无索引或索引无效

3、多表关联。

3、数据量。

优化策略

1,加索引。对where条件字段,order by 字段加索引或联合索引。

  注:有几种情况会导致索引无效

a、where条件中是or关系,会导致索引无效。

b、in查询时, in()中数据太多,优化器认为全表扫描更快时,也不会使用索引。

c、like、索引上使用函数等使索引失效。

d、字段属性设置为 not null ,where条件中有 is null 或 is not null 判断时,索引无效

2,去掉子查询 。我们都知道子查询效率低,能不用就尽量不用,比如我们可以通过join或left join或right join关联在实现子查询,如下例所示:

SELECT  b.businesskey, b.bo_def,  (SELECT boe.table_name FROM $ { db }.form_bo_def boe WHERE boe.alias =b.bo_def_code) table_nameFROM$ { db }.bpm b

改造后:

SELECT b.businesskey, b.bo_def, boe.table_nameFROM $ { db }.bpm bLEFT JOIN $ { db }.form_bo_def boe ON  b.bo_def_code = boe.alias

3,尽量少用或不用 or关联,可以通过union进行拼接。or会导致索引无效,当数据量多大时,速度会越来越慢。如下例所示:

SELECT b.businesskey, b.bo_def, boe.table_nameFROM $ { db }.bpm bLEFT JOIN $ { db }.form_bo_def boe ON  b.bo_def_code = boe.alias where b.proc_id ='#{userId}' or b.proc_id='0'

改造后:

SELECT b.businesskey, b.bo_def, boe.table_nameFROM $ { db }.bpm bLEFT JOIN $ { db }.form_bo_def boe ON  b.bo_def_code = boe.alias where b.proc_id ='#{userId}' UNIONSELECT b.businesskey, b.bo_def, boe.table_nameFROM $ { db }.bpm bLEFT JOIN $ { db }.form_bo_def boe ON  b.bo_def_code = boe.alias where  b.proc_id='0'

4,select查询时,避免用select * from table这种写法,采用select 字段 from 字段的方式来提升执行效率。

5、多表联查时,小表驱动大表。

例: user表10000条数据,class表20条数据select * from user u left join class c u.userid=c.userid这样则需要用user表循环10000次才能查询出来,而如果用class表驱动user表则只需要循环20次就能查询出来

6,适当增加冗余字段,减少多表联查(4张以上)情况。多表联查必然会带来性能问题,我们通过适当增加冗余字段,减少表之间关联查询。

以上为前一段时间SQL优化的心得。

上一篇 下一篇

猜你喜欢

热点阅读