centos mysql cpu_MySQL佔用CPU100%解決一例

一位同事負責的一套MySQL數據庫的CPU使用率達到100%,登上服務器top查看

Cpu(s):  95.9%us,  4.0%sy,  0.0%ni, 0.0%id,  20.0%wa,  0.0%hi,  0.0%si,  0.0%st

由於一直是在做Oracle的維護,對MySQL不熟悉,先在網上查了幾篇文章,但好像都是一個人寫的,不過從這些文章中也有了一個大體的處理思路。(由於不是我本人操作,沒有記錄詳細的日誌,這裏只介紹下處理過程和使用到的命令,正文中的代碼只是後期爲說明加的。)

先使用root用戶登上mysql,使用 show processlist命令查看當前哪些線程正在運行。查看下來一共有160多個

先簡單說一下各列的含義和用途:

id    一個標識,你要kill一個語句的時候很有用。

user  顯示當前用戶,如果不是root,這個命令就只顯示你權限範圍內的sql句。

host  顯示這個語句是從哪個ip 哪個端口上發出的。可以用來追蹤出問題語句的用戶。

db    顯示這個進程目前連接的是哪個數據庫。

command 顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。

time  此這個狀態持續的時間,單位是秒。

state  顯示使用當前連接的sql語句的狀態,很重要的列。state只是語句執行中的某一個狀態,以查詢sql爲例,可能需要經過copying to tmp table,Sorting result,Sending data等狀態纔可以完成。

info  顯示這個sql語句,因爲長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。

從show processlist命令輸出的結果看到有一條sql語句重複出現,但是info列顯示的不全只有select a.col1,a.col2,a.col3 from table1 a這樣的信息。那就先從這個表入手查,select count(*) from table1;查出這張表有60W+的數據。select count(*) 使用了6秒。但是現在不確定這個語句執行的時候有沒有where條件。

繼續查資料,查到show processlist命令出的結果出處information_schema庫下的processlist表。

可看到表porcesslist表的列跟show processlist輸出的列是一致的。

再查詢processlist表時發現info信息是完整的,在這裏找到上邊懷疑的sql的完整版爲select a.col1,a.col2,a.col3 from table1 a where a.col4='123' and a.col5='abc';

查看這個語句的執行計劃(類似下面這種)

可以看出語句沒有使用索引而是使用全表掃描。分別對col4='123' 和col5='abc'做了統計,發現col4='123'的記錄只有一條,而col5='abc'的記錄有5W+條,很明顯在col4上創建索引執行效率會高很多。查看錶上是否有col4列上的索引(類似下面這種)。

發現col4列上沒有索引,表的存儲引擎爲 InnoDB,於是在col4列上創建索引

再次查看執行計劃,發現語句使用索引掃描。

sql語句的執行效率立馬提升。CPU的使用率也降下來了。

這也還有一個疑問,oracle在創建索引時爲了避免鎖表引入了online創建索引。不知道mysql中如何在線創建索引?
————————————————
版權聲明:本文爲CSDN博主「天街踏盡公卿骨」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_32207065/article/details/113170832

添加索引語句:

ALTER TABLE `table_name` ADD INDEX index_type ( `type` );

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章