mysql占用CPU超過100 解決過程

2021-08-22 19:24:46 字數 2404 閱讀 7784

2023年12月2日上午,將學校新聞網2023年之前的45000多條記錄遷移到了新**的mysql資料庫,新**上有2023年1月1日之後的9000多條記錄,資料量一下子增加了5倍。

2023年12月3日晚上9點多,有領導和老師反映新聞網無法訪問,立即登入伺服器進行排查。

一、使用top命令看到的情況如下:

可以看到伺服器負載很高,,mysql cpu使用已達到接近400%(因為是四核,所以會有超過100%的情況)。

二、在伺服器上執行mysql -u root -p之後,輸入show full processlist; 可以看到正在執行的語句。

可以看到是下面的sql語句執行耗費了較長時間。

select id,title,most_top,view_count,posttime from article 

where status=3 and catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  

order by most_top desc,posttime desc limit 0,8

但是從資料庫設計方面來說,該做的索引都已經做了,sql語句似乎沒有優化的空間。

直接執行此條sql,發現速度很慢,需要1-6秒的時間(跟mysql正在併發執行的查詢有關,如果沒有併發的,需要1秒多)。如果把排序依據改為乙個,則查詢時間可以縮短至0.01秒(most_top)或者0.001秒(posttime)。

三、修改mysql配置檔案中的pool/buffer等數值,重啟mysql都沒有作用。

四、通過explain分析sql語句

explain select id,title,most_top,view_count,posttime from article 

where status=3 and catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  

order by most_top desc,posttime desc limit 0,8

可以看到,主select對27928條記錄使用filesort進行了排序,這是造成查詢速度慢的原因。然後8個併發的查詢使cpu專用很高。

五、優化

首先是縮減查詢範圍

select id,title,most_top,view_count,posttime from article 

where status=3 and catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and datediff(now(),posttime)<=90

order by most_top desc,posttime desc limit 0,8

發現有一定效果,但效果不明顯,原因是每條記錄都要做一次datediff運算。後改為

select id,title,most_top,view_count,posttime from article 

where status=3 and catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and postime>='2017-09-05'

order by most_top desc,posttime desc limit 0,8

查詢速度大幅提高。在php中,日期閾值通過計算得到

$d = date("y-m-d", strtotime('-90 day'));

$sql = "

select id,title,most_top,view_count,posttime from article 

where status=3 and catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and postime>='$d'

order by most_top desc,posttime desc limit 0,8

六、效果

查詢時間大幅度縮短,cpu負載很輕

MySQL占用CPU超過百分之100解決過程

本文 自 訪問網頁504 gateway time out,登陸伺服器檢視,記憶體正常,cpu使用率達到了400 因為是4核,所以到了400 幾乎全部滿負載在跑了,又在下圖中發現,單單乙個mysqld的程序,就佔了390 毫無疑問,資料庫的問題導致了網頁504。1 使用top看到的情況如下 2 登陸...

jstack分析cpu占用100

背景 執行測試程式後,top命令發現某個程序 pid 占用cpu達到100 檢視哪個執行緒占用最多資源 ps mp pid o thread,tid,命令檢視這個程序下面的所有執行緒占用情況。發現執行緒324占用最多。使用jstack進行跟蹤 jstack pid 進行檢視輸出到臨時檔案 jstac...

mysql占用cpu 100 解決辦法

今天對uchome的讀資料,轉移到另外臺資料庫伺服器 發現這台mysql伺服器,就mysql乙個程序 cpu顯示已經超過100 並且高居不下!訪問量比較高 首先排除了程式的問題!那估計是mysql配置的問題,開啟發現 query cache size 0 估計就是這個問題在造成的,沒有開查詢快取 一...