暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

Mysql一次Sending data占用大量时间的深入分析优化案例

应用DBA 2021-04-21
10449


用户反馈系统慢,但是没描述具体是哪里慢,登录到其mysql数据库中,通过slow.log分析查看,其中有个sql出现的频率较多,而且耗时较长,先拿这个sql分析一下:



SELECT s.userid,s.status,MAX(s.lastaccess) AS lastaccess FROM sessions s WHERE s.status=0 GROUP BY s.userid,s.status;


初步看到的信息:返回22条数据,但是Rows_examined几乎是整张表的条数,这里心里就有个眉目了。


如何优化呢,我们大概有个套路:

1. 采用explain对语句进行分析

explain SELECT s.userid,s.status,MAX(s.lastaccess) AS lastaccess FROM sessions s WHERE s.status=0 GROUP BY s.userid,s.status;


我们看到,key走的是sessions_1的索引,其实这里我们可以看出端倪,但是为了把sql优化的方法讲出来,咱们继续。


查看表的索引


查看表的状态

Avg_row_length不大(对于返回数据时,这个值可以供参考分析)

查看表的栏位

(没啥大的字段,与上面联合查询分析)


2. 使用profile分析sql在哪里消耗的时间长

(很好的一个工具,可惜5.7以后profile信息将逐渐被废弃,mysql推荐使用performance schema)

set profiling=on;(或者=1)


几乎所有的时间都消耗在Sending data上。

这里“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。那么排除发送数据的大小,基本确定,在收集数据上花的时间较长


3. 优化方案

根据sql,它要查询相同userid,status下的最近的登录记录,distinct by userid,status=0才22条,虽然用了索引,但是还是查询收集1千700万多条数据,有效发送数据才22条,所以这个不是效率最高索引,故创建复合二叉树索引(userid,status,lastaccess)


4. 查看优化后的效果


效率杠杠的


5. 总结


咱们大致说一下仅仅关于Mysql的一个优化思路:


1. 检查slow.log,通过mysqldumpslow 分析一下排名sql


2. 分析执行计划,查看表的状态,索引等信息


3. 分析执行过程,与配置文件信息一同查看分析



文章转载自应用DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论