`

MySQL Sending data导致查询很慢的问题详细分析

 
阅读更多

使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录数才几万条,但查询的速度非常慢,大概要4~5分钟左右


【处理过程】

1)explain

首先怀疑索引没有建好,于是使用explain查看查询计划,结果如下:


从explain的结果来看,整个语句的索引设计是没有问题的,除了第一个表因为业务需要进行整表扫描外,其它的表都是通过索引访问


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查看详细信息;

结果如下:


从结果可以看出,Sending data的状态执行了216s


4)排查对比

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

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

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


可以看出,不返回description的时候,查询时间只需要15s,返回的时候,需要216s,两者相差15倍


【原理研究】

至此问题已经明确,但原理上我们还需要继续探究。

这篇淘宝的文章很好的解释了相关原理:innodb使用大字段text,blob的一些优化建议

这里的关键信息是:当Innodb的存储格式是 ROW_FORMAT=COMPACT (or ROW_FORMAT=REDUNDANT)的时候,Innodb只会存储前768字节的长度,剩余的数据存放到“溢出页”中

我们使用show table status来查看表的相关信息:


可以看到,平均一行大约1.5K,也就说大约1/10行会使用“溢出存储”,一旦采用了这种方式存储,返回数据的时候本来是顺序读取的数据,就变成了随机读取了,所以导致性能急剧下降。


另外,在测试过程中还发 现,无论这条语句执行多少次,甚至将整个表select *几次,语句的执行速度都没有明显变化。这个表的数据和索引加起来才150M左右,而整个Innodb buffer pool有5G,缓存整张表绰绰有余,如果缓存了溢出页,性能应该大幅提高才对。

但实测结果却并没有提高,因此从这个测试可以推论Innodb并没有将溢出页(overflow page)缓存到内存里面

这样的设计也是符合逻辑的,因为overflow page本来就是存放大数据的,如果也放在缓存里面,就会出现一次大数据列(blob、text、varchar)查询,可能就将所有的缓存都更新了,这样会导致其它普通的查询性能急剧下降。


【解决方法】

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

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

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

 

分享到:
评论

相关推荐

    解决MySQL Sending data导致查询很慢问题的方法与思路

    主要介绍了解决MySQL Sending data导致查询很慢问题的方法与思路,感兴趣的小伙伴们可以参考一下

    深入分析MySQL Sending data查询慢问题

    通过一个实例给大家分享了MySQL Sending data表查询慢问题解决办法。 最近在代码优化中,发现了一条sql语句非常的慢,于是就用各种方法进行排查,最后终于找到了原因。 一、事故现场 SELECT og.goods_barcode, og....

    Mysql查询很慢卡在sending data的原因及解决思路讲解

    因为编写了一个Python程序,密集的操作了一个Mysql库,之前数据量不大时,没发现很慢,后来越来越慢,以为只是数据量大了的原因,但是后来慢到不能忍受了,查了半天,索引能用的都用上了,执行一次还是要3到4秒,不...

    mysql 卡死 大部分线程长时间处于sending data的状态

    长时间无法执行完,这些简单的sql语句,有时候集中在A表上,有时候集中在B表上,同时还有一些卡死在locked状态或update状态 看mysql的说明,sending data状态表示两种情况,一种是mysql已经查询了数据,正在发给...

    mysql查询缓慢分析.pdf

    MySQL Sending data导致查询很慢的问题详细分析 sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录4~5分钟左右 show processlist查看sql语句执行状态,查询结果如下

    MySQL调优利器【show profiles】

    是mysql提供可用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优测量。 默认情况下,参数处于关闭状态,并保存最近15次的运行结果 分析步骤 1、查看当前版本sql是否支持show profiles mysql> show ...

    sendingdata

    dsp效果器算法应用说明-sengdingdata

    Streaming Data

    In the same way, streaming data applications can accomplish amazing tasks like reading live location data to recommend nearby services, tracking faults with machinery in real time, and sending ...

    This is a complete email sending client in Visual Basic

    This is a complete email sending client in Visual Basic

    ThermalCouple_DataSending

    ThermalCouple_DataSending 协议MQTT 套接字编程

    Beginning PHP and MySQL 5:From Novice to Professional

    " Written for the budding web developer searching for a powerful, low-cost solution for building ... Updated for MySQL 5, includes new chapters introducing triggers, stored procedures, and views.

    分享在一键boot时出现sending boot FAILED的解决方案

    但是有时却会出现sending boot FAILED,窗口秒退的情况,本人浏览各大论坛提问的不少,回答的却都没有能解决问题,自己一番摸索后得到找到一个很简单的方法,就在5A资源网与各位好友们分享,下面就让我们开始吧!...

    Beginning PHP and MySQL 5, 2nd Edition

    Written for the budding web developer searching for a powerful, low-cost solution for building flexible, ...Updated for MySQL 5, includes new chapters introducing triggers, stored procedures, and views.

    Configuration - Sending SMS from SAP

    NULL 博文链接:https://sap.iteye.com/blog/832453

    Beginning PHP5, Apache, And MySQL Web Development.pdf

    You will also get experience in error handling and data validation while working on this site. ❑ Comic Book Fan Web site. The creation of this Web site takes you through the steps of building ...

Global site tag (gtag.js) - Google Analytics