MySQL CPU占用过高排查指南

MySQL CPU 占用过高时,排查具体占用资源的表需结合系统监控、数据库分析工具和 SQL 诊断命令。


🔍 ​一、快速定位问题根源

  1. 确认 MySQL 进程占用 CPU

    • 使用 tophtop 命令查看系统进程,确认是否为 mysqld 进程导致 CPU 飙升。
    • 若 MySQL 进程持续占用 90% 以上 CPU,需深入分析数据库内部操作。
  2. 区分负载类型:QPS 激增 vs. 慢查询

    • QPS 激增​:对比 CPU 曲线与 QPS(每秒查询量)曲线是否同步波动。若同步,说明高并发导致 CPU 压力。
      • 计算 QPS:
        SHOW GLOBAL STATUS LIKE 'Questions';  -- 获取总查询量
        SHOW GLOBAL STATUS LIKE 'Uptime';     -- 获取运行时间(秒)
        -- QPS = Questions / Uptime
    • 慢查询为主​:若 CPU 飙高而 QPS 未明显上升,大概率是慢 SQL 或锁竞争导致。

⚙️ ​二、定位高资源消耗的表

方法 1:实时分析活跃线程

通过 SHOW FULL PROCESSLIST 或系统表查询当前执行的 SQL 及操作的表:

-- 查看所有活跃线程(非 Sleep 状态)
SELECT * FROM information_schema.PROCESSLIST 
WHERE COMMAND != 'Sleep' AND TIME > 10  -- 筛选执行时间>10秒的线程
ORDER BY TIME DESC;
  • 关键字段​:
    • STATE:若为 Sending dataSorting resultCreating tmp table,表示可能涉及全表扫描或复杂计算。
    • INFO:显示正在执行的 SQL,从中提取操作的表名。
方法 2:分析慢查询日志
  1. 开启慢查询日志​:
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 1;  -- 记录超过1秒的查询
    SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
  2. 使用工具分析日志​:
    • ​**pt-query-digest(Percona Toolkit)​**​:
      pt-query-digest /var/log/mysql/slow.log --limit 10  -- 输出消耗最高的前10个查询
    • 输出结果关注点​:
      • Table:被频繁操作的表名。
      • Rows_examined:扫描行数过大(如百万级)的表。
      • Query_time:单次执行耗时长的 SQL。
方法 3:通过 Performance Schema 定位表级操作
-- 查看消耗 CPU 最高的 SQL 及其操作的表
SELECT DIGEST_TEXT AS query,SCHEMA_NAME AS db,COUNT_STAR AS exec_count,SUM_TIMER_WAIT/1e9 AS total_time_sec,SUM_ROWS_EXAMINED AS rows_examined
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY total_time_sec DESC 
LIMIT 10;
  • 关键信息​:
    • query 字段可直接看到 SQL 操作的表(如 SELECT * FROM orders)。
    • exec_count 该SQL模式被执行的次数
    • total_time_sec 该SQL模式所有执行的总耗时(单位:皮秒,除以1e9转换为秒;例如:SUM_TIMER_WAIT=12345678900001.23456789秒;识别最耗时的SQL模式
    • rows_examined 该SQL模式所有执行中检查的总行数;​例如​:1000000(表示这个SQL模式总共扫描了100万行)​,用于识别全表扫描或索引效率低下的查询

方法 4:检查表大小与索引状态
  1. 查询表空间占用​:

    SELECT TABLE_NAME,ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024, 2) AS size_mb,TABLE_ROWS
    FROM information_schema.TABLES 
    WHERE TABLE_SCHEMA = 'your_database'
    ORDER BY size_mb DESC;
    • 大表(GB 级)​​ 更容易因全表扫描导致 CPU 飙升。
    • 小表但高扫描频次​:可能索引缺失或统计信息过期。
  2. 检查索引有效性​:

    -- 查看表的索引情况
    SHOW INDEX FROM your_table;
    • Cardinality(基数)远小于实际行数,说明索引可能失效,需更新统计信息:
      ANALYZE TABLE your_table;

🛠️ ​三、针对性优化措施

  1. 紧急处理​:

    • 终止高消耗线程:
      KILL <thread_id>;  -- 从 PROCESSLIST 获取 thread_id
  2. 索引优化​:

    • 为高频查询的 WHEREJOINORDER BY 字段添加索引。
    • 避免索引失效:
      • 禁止对索引列使用函数(如 WHERE DATE(create_time) = ...)。
      • 避免隐式类型转换(如字符串字段用数字查询)。
  3. SQL 重写​:

    • 拆分复杂查询(如将子查询改为 JOIN)。
    • 减少 SELECT *,仅返回必要字段。
    • 分页查询优化:用 WHERE id > last_id LIMIT n 替代 OFFSET
  4. 配置调整​:

    • 增加临时表大小,避免磁盘临时表:
      tmp_table_size = 256M
      max_heap_table_size = 256M
    • 调整 InnoDB 缓冲池(通常设为物理内存的 70%):
      innodb_buffer_pool_size = 8G
  5. 架构扩展​:

    • 读写分离:将查询分流到只读副本。
    • 分库分表:对亿级大表按业务拆分。

📊 ​排查工具推荐

工具类型推荐工具用途
系统监控top, htop, vmstat定位进程及线程级 CPU 占用
SQL 分析pt-query-digest, EXPLAIN分析慢查询及执行计划
实时诊断SHOW PROCESSLIST, sys.schema查看活跃线程与资源消耗
可视化监控Prometheus + Grafana, PMM长期追踪性能指标(QPS/CPU/锁)

⚠️ ​注意

  • 锁竞争问题​:若 SHOW PROCESSLIST 显示大量线程状态为 Waiting for table lock,需检查长事务或死锁(information_schema.INNODB_TRX)。
  • 外部因素​:备份任务、批量数据维护也可能导致 CPU 短暂飙高,需结合操作日志排查。

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

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

相关文章

软件交付终极闸口:验收测试全解析

验收测试&#xff1a;软件交付的关键环节 目录 验收测试&#xff1a;软件交付的关键环节 一、验收测试&#xff1a;软件交付的终极闸口 核心目标与作用 在 SDLC 中的位置 二、验收测试类型详解&#xff1a;精准匹配业务场景 三、验收测试全流程解析&#xff1a;从计划到…

深度学习核心:卷积神经网络 - 原理、实现及在医学影像领域的应用

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#,Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发…

多线程(二) ~ 线程核心属性与状态

文章目录一. 线程创建&#xff08;start&#xff09;&#xff08;一&#xff09;继承Thread类&#xff0c;重写run&#xff08;二&#xff09;继承Runnable类&#xff0c;重写run&#xff08;三&#xff09;Thread匿名内部类重写&#xff08;四&#xff09;Runnable匿名内部类重…

Linux---编辑器vim

一、vim的基本概念1.三种模式①命令模式控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入插入模式或者进去底行模式②插入模式可进行文本输入&#xff0c;按Esc回到命令行模式③底行模式文件保存或退出&#xff0c;也可以进行文件替换&#…

如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安装 Guake 终端应用程序

通过本教程的简单步骤,在 Ubuntu 24.04 或 22.04 LTS Jammy JellyFish 上安装 Guake 终端以运行命令。 Guake(基于 Quake)是一个基于 Python 的终端模拟器。Guake 的行为类似于 Quake 中的终端:通过某个按键(热键)按下时,窗口会从屏幕顶部滚下来,再次按下相同的按键时…

谷歌Gemini 2.5重磅应用:多模态研究助手Multi-Modal Researcher,实现全网自动研究与AI播客生成

在人工智能赋能科研与内容创作的浪潮中,谷歌基于其最新大模型 Gemini 2.5 推出了突破性工具 Multi-Modal Researcher。这一系统通过整合多模态数据(文本、视频、实时网络信息),实现了从自动研究到内容生成的全流程自动化。用户只需输入研究主题或YouTube视频链接,系统即可…

防御综合实验

一、实验拓补图二、实验需求及配置需求一设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List : 10 20Trunk[SW2]vlan 10 [SW2]vlan 20 [SW2]interface GigabitEthernet 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEt…

堆----2.前 K 个高频元素

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; /** 桶排序: 首先遍历数组,使用HashMap统计每个元素出现的次数 创建一个大小为length 1的List数组,下标代表元素出现次数,出现次数一致的元素放在同一个数组中 倒数遍历List数组即可得得到前K个高频元素 细节注…

如何分析Linux内存性能问题

一、Linux中的buffer与cache的区别 Linux的内存管理与监控_linux服务器虚假内存和真实内存怎么区分-CSDN博客文章浏览阅读66次。本文主要是关于【Linux系统的物理内存与虚拟内存讲解】【重点对虚拟内存的作用与用法进行了讲解说明】【最后还对如何新增扩展、优化、删除内存交换…

二次型 线性代数

知识结构总览首先是我们的二次型的定义&#xff0c;就是说什么样的才算是一个二次型。然后就是如何把二次型化为标准型&#xff0c;最后就是正定二次型的定义和判断的一些条件。二次型的定义二次型其实是一种函数表达的方式&#xff0c;如上&#xff0c;含义其实就是每个项都是…

云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合

在当今微服务架构主导的时代&#xff0c;容器化、编排与服务治理已成为构建弹性、可扩展应用的核心支柱。本文将深入探讨如何将 Docker&#xff08;容器化基石&#xff09;、Kubernetes&#xff08;编排引擎&#xff09;与 Spring Cloud&#xff08;微服务框架&#xff09; 无缝…

vue让elementUI和elementPlus标签内属性支持rem单位

vue让elementUI和elementPlus标签内属性支持rem单位 如 Element Plus 的 el-table 默认不直接支持使用 rem 作为列宽单位 解决方法: 将 rem 转换为像素值&#xff08;基于根元素字体大小&#xff09; // 计算rem对应的像素值 const calcRem (remValue) > {// 获取根元素(ht…

基于OAuth2与JWT的微服务API安全实战经验分享

引言 在微服务架构中&#xff0c;API 安全成为了保护服务免受未授权访问和攻击的关键要素。本文结合真实生产环境案例&#xff0c;以实战经验为出发点&#xff0c;分享基于 OAuth2 JWT 的微服务 API 安全方案&#xff0c;从业务场景、技术选型、实现细节、踩坑及解决方案&…

scrapy库进阶一

scrapy 库复习 scrapy的概念&#xff1a;Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架 scrapy框架的运行流程以及数据传递过程&#xff1a; 爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器调度器把request–>引擎…

Objective-C实现iOS平台微信步数修改指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文介绍如何在iOS平台上使用Objective-C语言&#xff0c;通过苹果的HealthKit框架读取和修改微信步数以及相关健康数据。首先介绍如何引入和使用HealthKit框架&#xff0c;包括请求权限、读取步数数据、写入步…

【ElementPlus】深入探索ElementPlus:前端界面的全能组件库

&#x1f4da; 引言在现代 Web 开发中&#xff0c;创建既美观又功能强大的用户界面是一项挑战。Element Plus&#xff0c;作为 Vue 3 生态中的明星 UI 组件库&#xff0c;以其丰富的组件、优秀的性能和易用性赢得了广大开发者的青睐。本文将全面覆盖 Element Plus 的 常用核心组…

Json Jsoncpp

文章目录Json 介绍Jsoncpp 介绍Json::Value序列化接口反序列化接口序列化操作反序列化操作Json 介绍 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript 对象表示法&#xff09;是一种轻量级的数据交换格式&#xff0c;具有简洁、易读、跨平台等特点&#xff…

openwrt下安装istore(基于pve)

openwrt下安装istore&#xff08;基于pve&#xff09;ssh连接到openwrt&#xff0c;用如下命令安装istore&#xff1a;opkg update || exit 1cd /tmpwget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/i…

2025年Python Web框架之争:Django、Flask还是FastAPI,谁将主宰未来?

文章概要 作为一名Python开发者&#xff0c;我经常被问到同一个问题&#xff1a;在2025年&#xff0c;Django、Flask和FastAPI哪个框架更值得使用&#xff1f;随着技术的快速发展&#xff0c;这个问题的答案也在不断变化。本文将全面比较这三个主流Python Web框架的特点、性能、…

高级11-Java日志管理:使用Log4j与SLF4J

在现代Java应用开发中&#xff0c;日志&#xff08;Logging&#xff09;是系统监控、调试、故障排查和性能分析的核心工具。一个高效、灵活、可配置的日志系统&#xff0c;不仅能帮助开发者快速定位问题&#xff0c;还能为运维团队提供宝贵的运行时信息。在Java生态系统中&…