MySQL5.7運行CPU達百分之400處理方案

  • 2019 年 10 月 3 日
  • 筆記

用戶在使用 MySQL 實例時,會遇到 CPU 使用率過高甚至達到 100% 的情況。本文將介紹造成該狀況的常見原因以及解決方法,並通過 CPU 使用率為 100% 的典型場景,來分析引起該狀況的原因及其相應的解決方案。

常見原因
系統執行應用提交查詢(包括數據修改操作)時需要大量的邏輯讀(邏輯 IO,執行查詢所需訪問的表的數據行數),所以系統需要消耗大量的 CPU 資源以維護從存儲系統讀取到記憶體中的數據一致性。

說明:大量行鎖衝突、行鎖等待或後台任務也有可能會導致實例的 CPU 使用率過高,但這些情況出現的概率非常低,本文不做討論。

一、定位問題SQL

  • 資料庫CPU超頻,首要原因分析為執行SQL導致,先定位正在執行的SQL
# 進入資料庫連接工具,或者MySQL命令客戶端  # 查詢正在執行的SQL  select * from information_schema.`PROCESSLIST` where info is not null;

  • 根據COMMAND、TIME、STATE、INFO三個欄位查詢SQL資訊
  • COMMAND – 執行的數據操作類型
  • TIME – 執行的時間
  • STATE – 執行的狀態
  • INFO – 執行的具體SQL

發現很長一段時間,查詢都處在 「Sending data」狀態

查詢一下「Sending data」狀態的含義,原來這個狀態的名稱很具有誤導性,所謂的「Sending data」並不是單純的發送數據,而是包括「收集 + 發送 數據」

這裡的關鍵是為什麼要收集數據,原因在於:mysql使用「索引」完成查詢結束後,mysql得到了一堆的行id,如果有的列並不在索引中,mysql需要重新到「數據行」上將需要返回的數據讀取出來返回個客戶端。

二、使用explain查看SQL使用索引過程

  • explain顯示了MySQL如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句

  • 使用方法,在select語句前加上explain就可以了,下面是一個使用explain查詢SQL的例子

explain select * from user_info where tel = '17000000000';

三、show profile

  • 為了進一步驗證查詢的時間分布,於是使用了show profile命令來查看詳細的時間分布
  • 首先打開配置:set profiling=on;
  • 執行完查詢後,使用show profiles查看query id;
  • 使用show profile for query query_id查看詳細資訊;
  • 具體使用參考資料:MySQL Sending data導致查詢很慢的問題詳細分析