mysql优化小记–内存表务必关闭query_cache

作者: 魏延是反贼. 分类: 数据库, 系统·安全·调优

我们有一个模块,他的作用是实时的分析和统计用户的行为数据,数据量虽然巨大(大概每天2.6亿次请求),但是一直以来它都运行的挺好。直到有一天,我们需要在二楼的大屏幕上实时的给老大们展示到底此时此刻都有哪些用户正在使用我们的软件。

说起来这事也挺简单的,只不过就是加了一个Ip的统计嘛,不过上线之后却出现了严重的堆积。在进行了无数排查之后,发现瓶颈在Mysql.

那么来说说我们这个MySQL,由于数据库量巨大,我们为这个模块单独设立了一个自己的Mysql, 这个数据库里所有的表都是内存表,数据量跑起来大概占40G左右的内存。模块会产生大量的select,select的qps在20000qps左右,然而我们一直没有注意到的是,实际上2w的qps,已经非常接近“极限”了,新的feature上线之后,刚好超过了这个“极限”的一点点,于是……消息再也无法被处理完,开始产生大量的堆积,而堆积之后,模块加大了消息的处理进度,产生了更多的select,而我们才通过监控发现,纯内存的select已经到达了“瓶颈”。

select瓶颈1

注意看上图,select的qps已经出现了严重的削顶,完全无法处理上去了的感觉。

之后在Mysql里show processlist;放眼望去全是“Waiting for query cache lock”!!!  果断考虑把cache给关掉。

set global query_cache_type=0

直接动态的修改cache的值,然后重启一下模块……

select解决瓶颈

注意看重启之后的select的qps……惊人的突破了40k! 积压的消息瞬间处理完了……再也没有后顾之忧……

总结:

当你数据库的所有(大部分主要)表使用内存表的时候,请务必关闭query_cache,因为他们已经在内存了,完全不需要被cache……
性能提升十分明显……

 

 

 

标签:

返回正文

(1)条评论

  • 1170

    |

    我就是随便看看

    回复

您的留言是我最大的支持!