慢SQL优化

作者: 来杯熊酱不加糖 | 来源:发表于2019-07-07 22:17 被阅读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优化的心得。

    相关文章

      网友评论

        本文标题:慢SQL优化

        本文链接:https://www.haomeiwen.com/subject/nershctx.html