1. 程式人生 > >MySQL5.7執行CPU達百分之400處理方案

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

使用者在使用 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';
  • 具體用法詳見:MySQL explain用法和結果的含義

三、show profile

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