Mysql子查询优化技术

1:子查询优化的思路

   1.1  子查询合并(Subquery Coalescing)

        在某些条件下(语义等价:两个查询块产生同样的结果集),多个子查询能够合并成一个子查询(合并后还是子查询,可以通过其他方式消除子查询),

    这样可以把多次表扫描、多次连接减少为单次表扫描和单次连接。

           select * from work_list wl where wl.work_type='3' and (

                   exists(select wtl.user_id from work_to_list wtl where wtl.todo_status='0' and wtl.type='3') or

                   exists(select wtl.user_id from work_to_list wtl where wtl.todo_status='0' and wtl.type='4') 

          ) 

         我们对上面的sql语句进行分析,有可能对表work_todo_list进行两次表扫描,效率不高,那么我们对exists语句进行优化,

          select * from work_list wl where wl.work_type='3' and (

                   exists(select wtl.user_id from work_to_list wtl where wtl.todo_status='0' and (wtl.type='3' or wtl.type='4')) 

          )

          这样只对work_to_list 进行了一次表扫描,提高了查询效率。

   1.2 子查询展开(Subquery Unnesting)

          又称为子查询上拉,把一些子查询置于外层的父查询中,作为连接关系与外层父查询并列,其实质是把某些子查询重写为等价的多表连接操作,这样有关的

     访问路径、连接方法和连接顺序可能被有效利用,使得查询语句的层次尽可能的减少,常见的IN/ANY/SOME/ALL/EXISTS依据情况转换为半连接(SEMI JOIN)、

    普通类型的子查询消除等情况属于此类,

         select * from work_list wl, (select * from work_todo_list wtl where wtl.type='3')  v_wtl

        where wl.type='3' and v_wtl.todo_status='0'

       可优化为:

         select * from work_list wl, work_todo_list wtl where wl.type='3' and v_wtl.todo_status='0' and wtl.type='3'

   1.3 聚集子查询消除(Aggregate Subquery Elimination)

        聚集函数上推,将子查询转变为一个新的不包含聚集函数的子查询,并与父查询的部分或者全部表做左外连接,通常,一些系统

       支持的是标量聚集子查询(在子查询中,存在聚集函数(如max(), count())等,没有指定group by字句)的消除。

      

你可能感兴趣的:(sql,MySql)