首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【高性能MySQL】诊断间歇性问题SHOW GLOBAL STATUS

【高性能MySQL】诊断间歇性问题SHOW GLOBAL STATUS

原创
作者头像
用户9295575
修改2025-01-14 20:30:53
修改2025-01-14 20:30:53
2590
举报

什么是MySQL间歇性问题?

间歇性的问题比如系统偶尔停顿或者慢查询,很难诊断。有些幻影问题只在没有注意到的时候才发生,而且无法重现。诊断这样的问题往往要花费很多时间。

列举一些曾经遇到的间歇性数据库性能问题的实际案例:

  • memcached缓存中的一些重要条目过期,导致大量请求落到MySQL以重新生成缓存条目。
  • DNS查询偶尔会超时现象。
  • 可能是由于互斥锁争用,或者内部删除查询缓存的算法效率太低的缘故,MySQL的查询缓存有时候会导致服务有短暂的停顿。
  • 当并发超过某个阈值时,InnoDB的扩展性限制导致查询计划的优化需求很长的时间。

如何判断是单条查询问题还是服务器问题?

可以通过下面技术来解决:

1、使用SHOW GLOBAL STATUS

以高频率的执行一次SHOW GLOBAL STATUS命令来捕获Threads_running、Threads_connected、Questions和Queries 的“尖刺”或者“凹陷”。下面是输出的命令:

代码语言:sql
复制
mysqladmin -u USER -p extended-status -i1 | awk ' /Queries/{q=$4-qp; qp=$4} /Threads_connected/{tc=$4} /Threads_running/{printf "%5d %5d %5d\n", q, tc, $4}'
-- 输出结果
799  136  7
768  134  9
829  134  7
684  134  7
109  135  24
188  134  31
178  134  28
1178 134  7
1152 134  7
1241 135  7 

请注意替换 USER 为您的 MySQL 用户名。

这个命令每秒捕获一次SHOW GLOBAL STATUS的数据,该命令的工作原理如下:

mysqladmin extended-status 获取 MySQL 的扩展状态变量。

-i1 每一秒执行一次。

awk 程序解析这些状态变量的输出:

  • /Queries/ 匹配包含 "Queries" 的行,并计算自上次以来的查询增量。
  • /Threads_connected/ 匹配包含 "Threads_connected" 的行,并获取当前连接的线程数。
  • /Threads_running/ 匹配包含 "Threads_running" 的行,并打印出查询增量、连接的线程数以及正在运行的线程数。

如何解析上述的结果现象。猜测有两个原因的可能性比较大。其中之一是服务器内部碰到了某种瓶颈,导致新查询在开始执行前因为需要获取老查询正在等待的锁而造成堆积。另一个原因是服务器突然遇到了大量查询请求的冲击,比如memcached突然失效导致的查询风暴。

还有两种技术也可以判断:SHOW PROCESSLIST 、使用查询日志。我们之后再介绍。请关注我!

每天学习一点,每天进步一点,加油!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档