栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

mysql语句性能优化-使用case when 代替count(*)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mysql语句性能优化-使用case when 代替count(*)

文章目录
  • 前言
  • 一、问题SQL
  • 二、修改后SQL
  • 总结


前言

负责运维的项目有个页面加载特别慢,打开差不多要2分钟,但是页面数据并不算多,只有几百条。为了把页面加载速度慢的问题解决,通过查看后台日志,发现有一条慢sql,里面写的内容又长又臭。


一、问题SQL
 SELECt
        cnooc.*
    t3.project_name as project_name,
        t3.`year` as year,
        t3.award_name as award_name,
        t3.award_id as award_id,
        t3.major_code as major_code,
        t3.major_value as major_value,
        t1.awardTypeValue as awardTypeValue,
        t1.application_level as application_level,
        t1.average_score as initial_evaluation_score,
        t1.final_evaluation_level as final_evaluation_level,
        t1.create_unit_value as create_unit_value,
        t1.id as id,
        (
        SELECT
        count(*)
        FROM
        yk_score
        WHERe
        istjjt = '1'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS istjjt,
        ( ( SELECt count( * ) FROM yk_score WHERe final_evaluation_level = '特等奖' AND project_name = t3.project_name AND STATUS = 1 AND judges_level = 1 ) * 4 + ( SELECt count( * ) FROM yk_score WHERe final_evaluation_level = '一等奖' AND project_name = t3.project_name AND STATUS = 1 AND judges_level = 1 ) * 3+ ( SELECt count( * ) FROM yk_score WHERe final_evaluation_level = '二等奖' AND project_name = t3.project_name AND STATUS = 1 AND judges_level = 1 ) * 2 + ( SELECt count( * ) FROM yk_score WHERe final_evaluation_level = '三等奖' AND project_name = t3.project_name AND STATUS = 1 AND judges_level = 1 )
        ) / ( SELECt count( * ) FROM yk_score WHERe project_name = t3.project_name AND STATUS = 1 AND judges_level = 1 ) AS dpf,
        (
        SELECt
        count(*)
        FROM
        yk_score
        WHERe
        final_evaluation_level = '特等奖'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS grand_prize,
        (
        SELECt
        count(*)
        FROM
        yk_score
        WHERe
        final_evaluation_level = '一等奖'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS first_prize,
        (
        SELECt
        count(*)
        FROM
        yk_score
        WHERe
        final_evaluation_level = '二等奖'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS second_prize,
        (
        SELECt
        count(*)
        FROM
        yk_score
        WHERe
        final_evaluation_level = '三等奖'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS third_prize,
        (
        SELECt
        count(*)
        FROM
        yk_score
        WHERe
        final_evaluation_level = '不推荐'
        AND
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS no_prize,
        (
        SELECt
        count(*)
  yk_score
        WHERe
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) AS total_ticket,
        (
        select
        SUM(final_evaluation_score)/count(*)
        from
        yk_score
        where
        project_name = t3.project_name
        AND
        status = 1
        AND
        judges_level = 1
        ) as average_score
        FROM
        yk_score t3
        INNER JOIN
        yk_cnooc_progress t1
        ON
        t3.award_declaration_id = t1.id
        AND
        t1.review_link = 2
 ) as cnooc
 order by dpf desc,first_prize desc,second_prize desc,third_prize desc,initial_evaluation_score desc
    

二、修改后SQL

代码如下(示例):

 SELECT
        cnooc.* ,
        (	grand_prize * 4 + first_prize * 3+ second_prize* 2 +third_prize ) / (grand_prize+first_prize+second_prize+third_prize+no_prize) AS dpf,
        (grand_prize+first_prize+second_prize+third_prize+no_prize) AS total_ticket
        FROM
        (
        SELECt
        t1.average_score AS initial_evaluation_score,
        t1.id AS id,
        t1.year AS year,
        ( SELECT count( * ) FROM yk_scorecur WHERe istjjt = '1' AND project_name = t3.project_name ) AS istjjt,
        count(case when(final_evaluation_level="特等奖") then 1 else null end)as grand_prize ,
        count(case when(final_evaluation_level="一等奖") then 1 else null end)as first_prize,
        count(case when(final_evaluation_level="二等奖") then 1 else null end)as second_prize,
        count(case when(final_evaluation_level="三等奖") then 1 else null end)as third_prize,
        count(case when(final_evaluation_level="不推荐") then 1 else null end)as no_prize
        FROM
        yk_scorecur t3
        INNER JOIN vw_cnooc_progresscur t1 ON t3.award_declaration_id = t1.id
        GROUP BY
        t3.project_name
        ) AS cnooc
        
        order by dpf desc,first_prize desc,second_prize desc,third_prize desc,initial_evaluation_score desc

总结

修改后,sql 由原来的2分钟,变成了0.3秒。对于sql语句,尽量少用多个select count(*) 的语句。如果能用count case went 可以大大加快速度。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/828330.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号