MySQL案例分析--QueryCache

QueryCache联动内容:http://blog.itpub.net/29510932/viewspace-1694922/
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------
案例发生于生产环境,由于是临时的技术支持,截图没有了.....

场景:
M
ySQL-5.5.47, 隔离级别RR

背景:
业务人员反应数据库操作时不时出现非常明显的卡顿, 与此同时慢日志中出现大量的SQL;
问题的现象&排查:
1.先看监控图表: 发现CPU使用率,IO吞吐量, IO Utils, 网卡in/out流量, 内存的使用率都没有异常现象----应该不是服务器资源造成的;
2.登录到生产库,看一下processlist的情况,并没有明显的长连接或者长事务,咨询了开发人员,在应用层也没有手动开启长事务----应该和特殊的SQL或者事务没什么关系;
3.开发人员反馈并没有触发器/存储过程/定时任务----又排除几个影响因素;
4.查看了一下当天的慢日志,在某一个随机的时间点, 会出现很多的慢查询, 而且慢查询都是成片成片出现的, 成片出现的慢查询都有相同的TIMESTAMP----随机事件,可能是非人为的;
5.这种成片出现的慢查询, 全部是以Insert, Update这种DML作为前N条;

问题分析:
在排查过程中,初步得出的结论:
可能是SQL的问题; 而且设置的隔离级别是RR, 结合排查的第五点,感觉可能会是锁等待导致的;
在生产环境查看了一下这些DML表的结构,发现相关的索引都有, 也在测试环境试了一下, 发现这些DML并没有出现锁等待的现象;

用mysqldumpslow给某个时间点的近300条慢查询语句做了个统计, 发现DML语句大约只有10%多一点的样子,绝大多数还是select;
之后粗略看了一下这些select语句, explain的结果基本都是const, 说明这些语句本身并没有问题;

在这个过程中,发现一个现象:
这些select语句,约70%都是DML的那几张表, 而且不论什么类型select语句,记录下来的时间都是基本一致的,2.78-2.80秒之间;
疑点1:虽然不是很确定这种现象是不是有什么意义, 不过看上去像是由于这几张表进行了DML, 结果堵住了很多对这几张表的查询;
疑点2:除非是IO出现了波动或者峰值/没有索引/锁等待, 否则DML语句应该很少会出现在慢查询日志里面;

猜测是cache或者是buffer的设置问题, 于是去my.cnf检查一下配置, 然后看到了query_cache_size的设置;query_cache_size=256M
参考联动内容,其实Query Cache远没有发挥想象中
作用,不过>=5.6.8和5.7的版本中,query_cache_type默认都是关闭的, 5.5并不太清楚, 难道是这个Query_cache的问题?
翻了一下5.5的文档,发现query_cache_type的默认值是开启的, 但是size的默认值是0, 意味着如果什么都不动,那就是屏蔽了Query Cache,
然而配置文件里面修改了size, 所以Query Cache就开启了;

Query Cache的缺陷,在另一篇博文里面有描述, 对应到这次案例中的疑点1和疑点2, 做出几个推断:
在某个时间点内,应用层发起较多的DML,这些DML会尝试获取cache中某几张表的mutex,所以在慢查询中,在每个时间点,都是最先出现了Insert和Update(互相等待mutex);
由于Query Cache中,由于相关表的数据被清理,select会重新生成对应的result写入到Query Cache, 并且还存在并发的DML语句,导致频繁的在清空和写入Query Cache;
由于Query Cache设置得比较大,如果保存了大量的数据,那么在获取mutex, 并清理数据的时候, 也会消耗更多的时间;

联系运维人员,查看了一下生产库的Qcache的status,如下图

可以看到在mysql启动之后,Qcache触发了约1.2亿次的insert,但是只有约870万次的缓存命中;
这一组统计数据也基本验证了Query Cache不好用这一事实;

处理方式:
考虑到Qcache的统计结果,在线上库关掉应该也不会有什么问题,所以和相关运维人员说明了情况,在最近的维护时间内关掉这个Query Cache,然后观察一段时间;
反馈结果:
卡顿现象暂时消失了,慢日志也不再出现;
PS:Query Cache的问题多多,除非几乎没有DML,否则还是尽量不要开启的比较好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之PowerManager简介

android.os. PowerManager 通过 PowerManager 类我们可以对设备的电源进行管理。对该类API的使用将影响到电池寿命。只有在必须使用WakeLocks的时候,才使用WakeLocks,且在不使用它的时候要及时释放(release). 默认情况下,当用户对手机有一段时间没有操作后࿰

什么时候告白最合适?

1 电饭煲吐血了!(素材来源网络,侵删)▼2 比冰淇淋掉地上更悲剧的事(素材来源网络,侵删)▼3 老师的火气又上去了▼4 什么时候最适合告白(via.银教授,侵删)▼…

helloworld:一个完整的WCF案例

服务端 1.创建一个空的解决方案:WCFDemo: 2.创建一个宿主控制台程序:Host 3.右击Host项目,选择“添加”--“新建项”,选择“WCF服务”创建名为“Service1.cs”的服务 如此:VS2010已经为我们创建了 IService1.cs Service1.cs a…

极简实用的Asp.NetCore模块化框架决定免费开源了

背景在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块效率也很高。但不得…

我做的OSC界面

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/hotbain/blog/118542

Fragment生命周期

通过Android Studio创建包含两个Fragment的Activity:QuestListFragment、QuestInputFragment 调用的过程如下: 打开APPQuestListFragment﹕ onAttachQuestListFragment﹕ onCreateQuestListFragment﹕ onCreateViewQuestListFragment﹕ onViewCreatedQue…

使用Nagios监控esx、esxi、vcenter

系统环境:Centos6.3 最小化安装环境准备yum install –y libxml2-devel make gcc1、安装前准备 (1)创建nagios用户和用户组 [rootlocalhost ~]#useradd -s /sbin/nologin nagios [rootlocalhost ~]#mkdir /usr/local/nagios [rootlocalhost ~…

龙芯上市是自主路线被广泛认可的风向标

日前,龙芯通过科创板上市委员会审核,此次计划募资35.12亿元。其中,12.58亿元用于先进制程芯片研发及产业化项目,10.54亿元用于高性能通用图形处理器芯片及系统研发项目;12亿元用于补充流动资金。公开材料还披露了很多细…

量子计算机是程序员的未来,研究者:量子计算机一旦成功问世,时间也许会失去存在的意义...

贝尔实验室的科学家索尔,自从在1994年35界计算科学基础年会上提出量子算法后,立刻引起全世界科学界的轰动,量子计算机的研究热潮自此到来。量子计算机的运行方式以及存储计算方式,都与经典计算机存在着很大不同。经典计算机的存储…

.NET 现代化动态 LINQ 库 Gridify

动态 LINQ大家好,我是等天黑, 这次继续介绍开源项目,Gridify 是一个现代化动态 LINQ 库,它以最简单的方式将您的字符串转换为 LINQ 查询,并且有出色的性能。它还提供了一种使用基于文本的数据应用过滤、排序和分页的简单方法&…

brew mysql 添加修改mysql配置

为什么80%的码农都做不了架构师?>>> brew安装的MySQL是没有默认配置文件的,因此Mysql使用默认配置启动。我们需要手动创建my.cnf去覆盖默认配置。在/usr/local/opt/mysql 下确实有 my.cnf 但是并没有在启用中,应该是作为一个示例…

LINUX BASH SHELL,小小学习一下

注意点要注意的: 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x $x 1" 或者 xexpr $x 1 两个比较表格要记得: 对应的操作 整数操作 字符串操作 相同 -eq 不同 -ne ! 大…

“人肉”背后隐藏的网络风险

“遭此不幸”的演艺界大碗包括 Jay-Z、碧昂斯 (Beyonce)、布兰妮。斯皮尔斯 (Britney Spears) 以及金。卡戴珊 (Kim Kardashian) 等,他们的个人信息被公诸于众。此外,这次泄露事件的受害者甚至包括美国第一夫人米歇尔。奥巴马 (Michelle Obama)、副总统乔…

数学系都是怎么发「新年祝福」的?

全世界只有3.14 % 的人关注了爆炸吧知识过年啦!你都收到什么样的祝福?(快到留言区留言)不过看来看去,还是超模君曾经收到的一条祝福最特别了!超模君今天把这份新年祝福分享给大家:长按图片可保存…

NET 6 中新增的LINQ 方法

.NET 6 中添加了许多 LINQ 方法。下表中列出的大多数新方法在 System.Linq.Queryable 类型中具有等效方法。欢迎关注如果你刻意练习某件事情请超过10000小时,那么你就会达到世界级别今晚打老虎TryGetNonEnumeratedCount 尝试在不强制枚举的情况下确定序列中的元素数…

CSV格式数据如何导入MySQL?

经常有客户咨询如何将CSV文件导入到MySQL数据库中,特写此文介绍一种方便、快捷的方法。 我们要使用的辅助工具是著名的MySQL管理软件:Navicat for MySQL 1)我准备了一个字符编码为UTF-8的标准CSV文件,总共有2001条记录&#xff08…