SELECT
t.str_code AS strCode,
t.str_unit AS strUnitName,
COUNT( m.uuid ) AS intNum 
FROM
( SELECT str_code, str_unit, ifnull( INT_ORDER, 0 ) AS intOrder FROM base_unit WHERE int_unit_level = 1 ) t
LEFT JOIN members m ON m.unit_fenju_uid = t.str_code 
AND m.STR_MEMBER_TYPE = 'normal'
LEFT JOIN GROUP_LINK l ON l.STR_MEMBER_UID = m.uuid 
WHERE
1 = 1 
GROUP BY
t.str_code,
t.str_unit,
t.intOrder 
ORDER BY
COUNT( m.uuid ) DESC,
t.intOrder ASC
orcl向mysql中移植发现查询好慢   mysql要120s   orcl秒出

解决方案 »

  1.   

    1. GROUP_LINK 表在查询中没用啊;
    2. 在 members.unit_fenju_uid 上加个索引试试;看看效果,再继续
      

  2.   

    1.left join关联条件需要建立索引;
    2.子查询t没有必要,把里面where条件放到外层最后也一样;
    3.不清楚你的表结构,不知道你的group by 是什么用途
      

  3.   

    where 1=1 这种条件,如果被我们的DBA发现,不被批死才怪呢,SQL语不能这样子写的,这样子容易造成全表扫描啊。
      

  4.   

     ifnull  is null 在我们的DBA中检查,都可以不出现,要写入数据时就必须填值,我的DB里面没有字段是允许为空的。那怕是日期也有一个假的日期值填入。
      

  5.   

    没有你的表结构,也不了解你的业务,只能优化的这个样子。如果业务允许,把left join换成join会快一些。
    另外看你的几个表,都没有索引,怎么加索引,百度一下吧,好多内容的。
    -- SELECT
    --     t.str_code AS strcode,
    --     t.str_unit AS strunitname,
    --     COUNT(m.uuid) AS intnum
    -- FROM
    --     base_unit t
    --     LEFT JOIN members m ON
    --         m.unit_fenju_uid = t.str_code
    --     AND
    --         m.str_member_type = 'normal'
    --     LEFT JOIN group_link l ON l.str_member_uid = m.uuid
    -- WHERE
    --     t.int_unit_level = 1
    -- GROUP BY
    --     t.str_code,
    --     t.str_unit,
    --     ifnull(t.int_order,0)
    -- ORDER BY
    --     COUNT(m.uuid) DESC,
    --     ifnull(t.int_order,0) ASC ;
      

  6.   

    前几天在书上(深入浅出mysql)看到对于这种恒成立的条件,mysql会自动优化掉(即去掉),