SQL调优案例,MYSQL服务器CPU100%问题解决

Mysql服务器经常性CPU占用100%,按照Mysql解决思路,应该是有大的SQL语句在占用CPU时间。

使用如下命令将语句打印到文本

mysql -uroot -ppasswd -e "show full processlist" > c:\test.txt

使用文本编辑工具分析后

得到如下语句:

select ret.*
  from (select tt.sourcetype         as sourcetype,
               tt.pointtype          as pointtype,
               tt.upid               as upid,
               tt.gotdate            as gotdate,
               tt.credit             as credit,
               tt.classid            as classid,
               tt.classname          as classname,
               tt.xxkc               as xxkc,
               tt.xskc               as xskc,
               tt.trainMode          as trainMode,
               tt.place              as place,
               tt.courseid           as courseid,
               tt.coursetype         as coursetype,
               tt.coursename         as coursename,
               tt.rewardPointApplyId as rewardPointApplyId,
               tt.achieveWay         as achieveWay,
               tt.type               as type
          from (select '9' as sourcetype,
                       uk.C_POINTTYPE as pointtype,
                       uk.C_OID as upid,
                       utc.CREATEDATE as gotdate,
                       uk.credit as credit,
                       utc.classid as classid,
                       utc.classname as classname,
                       utc.xxkc as xxkc,
                       utc.xianshangkc as xskc,
                       utc.trainMode as trainMode,
                       utc.place as place,
                       '' as courseid,
                       '' as coursetype,
                       '' as coursename,
                       '' as rewardPointApplyId,
                       '' as achieveWay,
                       '' as type
                  from (select distinct (k.C_CLASSID) as C_CLASSID,
                                        '9' as C_POINTTYPE,
                                        '' as C_OID,
                                        k.C_USERID as C_USERID,
                                        sum(k.c_point) as credit
                          from LES_USERPOINTTASK k
                         where k.C_USERID = '14964'
                           and k.C_CLASSID is not null
                         group by k.C_CLASSID) uk,
                       (select tc.OID         as classid,
                               tc.CREATEDATE  as CREATEDATE,
                               tc.CLASSNAME   as classname,
                               t1.xxkc        as xxkc,
                               t1.xianshangkc as xianshangkc,
                               tc.trainMode   as trainMode,
                               tc.place       as place
                          from LMS_CLASS tc
                          left join (select t0.classid,
                                           group_concat(t0.xianxiakc) as xxkc,
                                           group_concat(t0.xianshangkc) as xianshangkc,
                                           sum(t0.credit) as credit
                                      from (select tcc.CLASS_ID as classid,
                                                   CASE
                                                     WHEN tcc.THEACH_MODE > 0 THEN
                                                      group_concat(tcc.COURSE_NAME)
                                                     ELSE
                                                      ''
                                                   END as xianxiakc,
                                                   CASE
                                                     WHEN tcc.THEACH_MODE > 0 THEN
                                                      ''
                                                     ELSE
                                                      group_concat(tcc.COURSE_NAME)
                                                   END as xianshangkc,
                                                   sum(integration) as credit
                                              from LMS_CLASS_COURSE tcc
                                             group by tcc.CLASS_ID,
                                                      tcc.THEACH_MODE) t0
                                     group by t0.classid) t1
                            on t1.classid = tc.OID) utc
                 where uk.C_CLASSID = utc.classid
                   and uk.credit is not null
                   and uk.C_USERID = '14964'
                union
                select '9' as sourcetype,
                       '' as pointtype,
                       lup.C_OID as upid,
                       lup.CREATEDATE as gotdate,
                       lup.C_POINT as credit,
                       lup.C_CLASSID as classid,
                       lup.C_CLASSNAME as classname,
                       '' as xxkc,
                       '' as xskc,
                       '1' as trainMode,
                       ltc.place as place,
                       '' as courseid,
                       '' as coursetype,
                       '' as coursename,
                       '' as rewardPointApplyId,
                       '' as achieveWay,
                       '' as type
                  from LES_USERPOINTTASK lup, LMS_CLASS ltc
                 where lup.C_TRAINWAY = '外派'
                   and ltc.OID = lup.C_CLASSID
                   and lup.C_USERID = '14964'
                union
                select cs.C_COURSETYPE as sourcetype,
                       up.C_POINTTYPE as pointtype,
                       up.C_OID as upid,
                       up.CREATEDATE as gotdate,
                       cs.C_CREDIT as credit,
                       '' as classid,
                       '' as classname,
                       '' as xxkc,
                       '' as xskc,
                       '' as trainMode,
                       '' as place,
                       cs.C_COURSEID as courseid,
                       cs.C_COURSETYPE as coursetype,
                       cs.C_COURSENAME as coursename,
                       '' as rewardPointApplyId,
                       '' as achieveWay,
                       '' as type
                  from LES_COURSE cs, LES_USERPOINTTASK up
                 where cs.C_COURSEID = up.C_ONLINECOURSEID
                   and up.c_classid is null
                   and up.C_USERID = '14964'
                union
                select '8' as sourcetype,
                       'optional' as pointtype,
                       '' as upid,
                       rp.C_ACHIEVEDATE as gotdate,
                       rp.C_REWARDPOINT as credit,
                       '' as classid,
                       '' as classname,
                       '' as xxkc,
                       '' as xskc,
                       '' as trainMode,
                       '' as place,
                       '' as courseid,
                       '' as coursetype,
                       '' as coursename,
                       rp.C_OID as rewardPointApplyId,
                       rp.C_ACHIEVEWAY as achieveWay,
                       rp.C_TYPE as type
                  from LES_REWARDPOINTAPPLY rp
                 where rp.C_USERID = '14964'
                   and rp.C_RESULT = '1'
                   and rp.C_APPROVESTATUS = '3') tt
         where date_format(tt.gotdate, '%Y') = '2017'
         order by tt.pointtype) ret limit

针对各段执行结果的评估,查询到该段占用时间最长,需要将近8分钟才能有结果:

select tc.OID         as classid,
                               tc.CREATEDATE  as CREATEDATE,
                               tc.CLASSNAME   as classname,
                               t1.xxkc        as xxkc,
                               t1.xianshangkc as xianshangkc,
                               tc.trainMode   as trainMode,
                               tc.place       as place
                          from LMS_CLASS tc
                          left join (select t0.classid,
                                           group_concat(t0.xianxiakc) as xxkc,
                                           group_concat(t0.xianshangkc) as xianshangkc,
                                           sum(t0.credit) as credit
                                      from (select tcc.CLASS_ID as classid,
                                                   CASE
                                                     WHEN tcc.THEACH_MODE > 0 THEN
                                                      group_concat(tcc.COURSE_NAME)
                                                     ELSE
                                                      ''
                                                   END as xianxiakc,
                                                   CASE
                                                     WHEN tcc.THEACH_MODE > 0 THEN
                                                      ''
                                                     ELSE
                                                      group_concat(tcc.COURSE_NAME)
                                                   END as xianshangkc,
                                                   sum(integration) as credit
                                              from LMS_CLASS_COURSE tcc
                                             group by tcc.CLASS_ID,
                                                      tcc.THEACH_MODE) t0
                                     group by t0.classid) t1
                            on t1.classid = tc.OID

其中LMS_CLASS表12800多条记录,LMS_CLASS_COURSE这张表也才9000多条记录,没理由这么慢。在两张表的classid和oid上均存在索引

查看执行计划,并未走索引


改写了SQL结果如下:

SELECT
	classid,
	CREATEDATE,
	classname,
	trainMode,
	place,
	group_concat(t0.xianxiakc) AS xxkc,
	group_concat(t0.xianshangkc) AS xianshangkc,
	sum(t0.credit) AS credit
FROM
	(
		SELECT
			classid,
			CREATEDATE,
			classname,
			trainMode,
			place,
			CASE
		WHEN tcc.THEACH_MODE > 0 THEN
			group_concat(tcc.COURSE_NAME)
		ELSE
			''
		END AS xianxiakc,
		CASE
	WHEN tcc.THEACH_MODE > 0 THEN
		''
	ELSE
		group_concat(tcc.COURSE_NAME)
	END AS xianshangkc,
	sum(integration) AS credit
FROM
	(
		SELECT
			tc.OID AS classid,
			tc.CREATEDATE AS CREATEDATE,
			tc.CLASSNAME AS classname,
			tc.trainMode AS trainMode,
			tc.place AS place,
			t1.THEACH_MODE,
			t1.COURSE_NAME,
			t1.integration
		FROM
			LMS_CLASS tc
		LEFT JOIN LMS_CLASS_COURSE t1 ON t1.CLASS_ID = tc.OID
	) tcc
GROUP BY
	classid,
	CREATEDATE,
	classname,
	trainMode,
	place,
	THEACH_MODE
	) t0
GROUP BY
	classid,
	CREATEDATE,
	classname,
	trainMode,
	place

结果如下,查询结果月0.88s,快了近1000倍




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值