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
英文地址,請注明出處:http://en.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生態系統中&…