mysql profiling sending data_深入分析MySQL Sending data查询慢问题_长尾科技的博客-程序员宅基地

技术标签: mysql profiling sending data  

通过一个实例给大家分享了MySQL Sending data表查询慢问题解决办法。

最近在代码优化中,发现了一条sql语句非常的慢,于是就用各种方法进行排查,最后终于找到了原因。

一、事故现场

SELECT og.goods_barcode, og.color_id, og.size_id, SUM(og.goods_number) AS sold_number FROM order o

LEFT JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 AND o.shipping_status = 0

AND o.create_time > '2017-10-10 00:00:00' AND o.ck_id = 1 AND og.goods_id = 13421 AND o.is_separate = 1 AND o.order_status IN (0, 1) AND og.is_separate = 1

GROUP BY og.color_id, og.size_id

上面的这条语句是一个联表分组查询语句。

执行结果:

我们可以看到,这条语句用了 1.300 秒, 而 Sending data 就用了 1.28 秒,占用了将近 99% 的时间,所以,我们对这个进行优化。

怎么优化呢?

二、SQL语句分析三板斧

1、explain分析

对上边的语句进行 explain 分析:

explain SELECT og.goods_barcode, og.color_id, og.size_id, SUM(og.goods_number) AS sold_number FROM order o

LEFT JOIN order_goods og ON o.order_id = og.order_id WHERE o.is_send = 0 AND o.shipping_status = 0

AND o.create_time > '2017-10-10 00:00:00' AND o.ck_id = 1 AND og.goods_id = 13421 AND o.is_separate = 1 AND o.order_status IN (0, 1) AND og.is_separate = 1

GROUP BY og.color_id, og.size_id

执行结果:

通过explain, 我们可以看到上边的语句,有用到索引key。

2、show processlist

explain看不出问题,那到底慢在哪里呢?

于是想到了使用 show processlist 查看sql语句执行状态,查询结果如下:

发现很长一段时间,查询都处在 “Sending data”状态

查询一下“Sending data”状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。

3、show profile

为了进一步验证查询的时间分布,于是使用了 show profile 命令来查看详细的时间分布

首先打开配置:set profiling=on;

执行完查询后,使用show profiles查看query id;

使用show profile for query query_id查看详细信息;

三、排查优化

1.排查对比

经过以上步骤,已经确定查询慢是因为大量的时间耗费在了Sending data状态上,结合Sending data的定义,将目标聚焦在查询语句的返回列上面

经过一 一排查,最后定为到一个description的列上,这个列的设计为:descriptionvarchar(8000) DEFAULT NULL COMMENT '游戏描述',

于是采取了对比的方法,看看“不返回description的结果”如何。show profile的结果如下:

【解决方法】

找到了问题的根本原因,解决方法也就不难了。有几种方法:

1)查询时去掉description的查询,但这受限于业务的实现,可能需要业务做较大调整

2)表结构优化,将descripion拆分到另外的表,这个改动较大,需要已有业务配合修改,且如果业务还是要继续查询这个description的信息,则优化后的性能也不会有很大提升。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30599809/article/details/114329371

智能推荐

Java并发编程_Java并发编程实战(11)_vx-Yang_Gaige的博客-程序员宅基地

1.生产者和消费者模式在并发编程中使用生产者和消费者模式能够解决大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度。 在线程的世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。 tips:什么...

maya的布尔运算规则_mengtianwxs的博客-程序员宅基地_maya布尔

私总结了一下maya布尔运算失败的若干原因以及其经典的布尔消失问题。第一,避免combine操作使参加布尔运算的节点具备布尔运算的程序范畴。   如果将两个combine的物体与另一物体进行布尔运算很容易出现问题。此时可以事先将两个物体交集运算(union)之后再与其他物体参加布尔运算从而避免布尔运算失败。*以下几点则是参考网上资料。第二,布尔运算的两个物体接触的部分必须要

MySQL 性能优化_dan_xian的博客-程序员宅基地

1. 为查询缓存优化你的查询大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例:...

echart图表控件配置入门(常用图表数据动态绑定)_我笔记的博客-程序员宅基地

效果显著,码到病除现在分别对折线图、柱状图、饼图、中国地图四类图表的数据绑定进行详细的介绍。echarts中其它的图表方法都差不多,只要了解官方的demo,按照指定的数据结构进行解析都能很方便的得到想要的结果;echarts中提供了setOption、setSeries两个方法可以对图表的相关数据和属性进行动态设置,setOption一定要在setSeries之前设置;

虚拟主机的开端_旋枫在线的博客-程序员宅基地

<br />什么叫虚拟主机?<br />  定义1:虚拟主机(Virtual Host Virtual Server)是使用特殊的软硬件技术,把一台计算机主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名和IP地址(或共享的IP地址),具有完整的Internet服务器功能。   <br />    定义2:虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机分割成多个的逻辑存储单元,每个单元都没有物理实体,但是每一个物理单元都能像真实的物理主机一样在网络上工作,具有单独的域名、IP地址(或共享

java中的catch中的异常e_java – catch(异常e)后跟if(e instanceof Exception)_weixin_39744606的博客-程序员宅基地

今天我偶然发现了这段代码try {...} catch (Exception e) {if (e instanceof Exception) {...} else {...}}if-else分支是否有意义?不会被捕获异常e永远是异常的一个实例?解决方法:是的,e永远是异常的一个实例.因此,您发布的代码没有多大意义.即使您想要处理不同的异常,您也可以执行以下操作之一(示例):catch( IOExc...

随便推点

HBase RowKey与索引设计_weixin_30763397的博客-程序员宅基地

1.HBase的存储形式hbase的内部使用KeyValue的形式存储,其key时rowKey:family:column:logTime,value是其存储的内容。其在region内大多以升序的形式排列,唯一的时logTime是以降序的形式进行排列。所以,rowKey里越靠近左边的信息越容易被检索到。其设计时,要考虑把重要的信息放左边,不重要的信息放到右边。这样可以提高查询数据的速...

linux下java程序与C语言程序通过SOCKET通信的简单例子_guan506713512的博客-程序员宅基地

本例中C语言端作为服务器,java端作为客户端代码如下:/****************** server program *****************/#include #include #include #include #incl

KMP 字符串匹配算法_Java_SuSheng的博客-程序员宅基地

字符串匹配算法,Knuth-Morris-Pratt算法(简称KMP),需要达成的目标是,找出某字符串a“ABCDABD” 在字符串b“BBC ABCDAB ABCDABCDABDE JDKAB”中是否存在,读了一些文章,暂时觉得,阮一峰的文章解释的还比较通俗易懂,以下,是我基于文章做出的代码及逻辑分析/** * KMP 算法 * http://www.ruanyif...

从AlexNet到BERT,深度学习这些年那些超重要的idea回顾总结_人工智能与算法学习的博客-程序员宅基地

本文作者Denny Britz按时间总结的深度学习比较重要的idea集锦,推荐新人看,几乎给自12年以来最重要的idea 都列了出来,这些 idea 可以说得上是养活了无数人,大家都基于这...

swift -SnapKit一些基本使用_weixin_30555753的博客-程序员宅基地

参考:SnapKit - 修改约束https://blog.csdn.net/longshihua/article/details/80289061import SnapKitclass ViewController: UIViewController { private var isUpdateSnapkitV = false ...

推荐文章

热门文章

相关标签