Lgbook的gravatar头像
Lgbook 2015-12-22 15:47:07

sql复杂查询语法的mysql性能如何优化?

SELECT
       (CASE
         WHEN 
          (SELECT COUNT(*)
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID) > 1 THEN
          (SELECT PERNAME
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID
             AND ISDELETED = 0)
         ELSE
          (SELECT PERNAME
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID)
       END) AS PERNAME
  FROM BALANCE DB
  LEFT JOIN BALANCE_BONUS DBB
  ON DBB.ID = DB.BONUSID
 WHERE  DB.ISDELETED != 1
 ORDER BY DB.ID; 

----------------------------------------------------

(CASE
         WHEN 
          (SELECT COUNT(*)
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID) > 1 THEN
          (SELECT PERNAME
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID
             AND ISDELETED = 0)
         ELSE
          (SELECT PERNAME
             FROM EMPLOYEE
            WHERE PERCOD = DB.PERID)
       END) AS PERNAME

这一段代码会非常消耗查询时间。 作用是 排除 EMPLOYEE 表中PERCOD重复的数据 , ISDELETED字段为已删除。 首先查询级联的人员是否有重复数据,如果只有一条则显示这唯一的一条; 如果有多条,则显示ISDELETED字段为0的一条数据。 有没有大牛给个优化解决方法!!!

所有回答列表(4)
touch39的gravatar头像
touch39  LV10 2015年12月23日

按照你上面说的,按我的理解  最后的结果是显示一条 你直接先select ISDELETED字段为0的 然后去重不就可以了

最代码官方的gravatar头像
最代码官方  LV167 2015年12月23日

如果能将查询拆分的话是最好的方案,本身复杂查询会随着数据量的增加而性能下降是事实,参考下之前最代码关于私信的经验吧。

相关资料和代码:

最代码网站用户私信列表采用mysql union查询优化为Redis查询的经验和相关代码片段分享

mysql sql查询如何实现发私信用户和其他用户的列表?要求消重所有重复的用户结果

最代码网站的私信功能

Chou_Joy的gravatar头像
Chou_Joy  LV3 2015年12月23日

拆分吧

Lgbook的gravatar头像
Lgbook  LV3 2015年12月24日
 select pername from
 (SELECT pername, percod,
 row_number() over(partition by percod order by isdeleted)as rr
  FROM employee
  ) where rr =1 

用这个能快点

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友