一句 mysql#show processlist 引起的思想「革命」

前幾天在看一個億級的視頻中談到mysql優化和解決的方案,其中說到一個命令 show processlist,因爲對這個命令也是基於工做經驗的普通使用,並無深刻研究,因此忽然想深刻了解下這個命令的一些使用以及原理,因此整理下技術棧。mysql

那好,要理解及使用這個命令,首先就要弄清楚:
  1. show processlist 是什麼命令?
  2. show processlist 在何時使用?
  3. show processlist 怎麼使用?
  4. show processlist 在mysql中的實現原理。
show processlist 是什麼?

show processlist 字面意思就是,顯示進程列表,這個列表最多顯示100條紀錄,要顯示所有數據,使用show full processlistsql

show processlist 在何時使用?

這命令,不限制場景使用,可是使用頻次最高的,莫過於數據庫出現瓶頸的時候,須要分析數據,查看哪一個進程執行時間比較長,哪些進程一直沒有執行完而釋放。而後針對某些狀況,把進程 kill 掉;殺掉進程的命令是:kill id(進程號)數據庫

show processlist 怎麼使用?

那不少人就會問,這個命令怎麼使用,或者說,怎麼分析這個命令的數據結果;
執行 show processlist 後,會出現相似如下結果併發

在哪裏執行 show processlist 命令?
一、直接在命令行模式下執行
mysql# show processlist;
二、能夠在IDE工具中,連接數據庫後,而後在命令模式執行 show processlist

圖片描述

先了解這些字段表明什麼意思高併發

Id:進程號
User:顯示當前用戶,若是不是root,這個命令就只顯示你權限範圍內的sql語句
Host:顯示是哪一個IP地址及哪一個端口請求的語句;能夠根據這些IP地址分析
db:請求哪一個數據庫
Command:顯示當前鏈接的執行的命令,通常就是休眠(sleep),查詢(query),鏈接(connect)
Time:此這個狀態持續的時間,單位是秒
State:顯示使用當前鏈接的sql語句的狀態,很重要的列,state只是語句執行中的某一個狀態,例如查詢,須要通過copying to tmp table,Sorting result,Sending data等狀態才能夠完成
Info:顯示這個sql語句,由於長度有限,因此長的sql語句就顯示不全,可是一個判斷問題語句的重要依據工具

那麼會不少人有疑問,執行了這些命令,怎麼根據這些命令來分析呢,下面帶着這些疑問來詳細分析幾個重要字段指標。
Command字段:優化

休眠(sleep)形成不少 sleep 進程的可能緣由有幾個

1. 使用了太多持久鏈接(我的以爲,在高併發系統中,不適合使用持久鏈接)
2. 程序中,沒有及時關閉mysql鏈接
3. 數據庫查詢不夠優化,過分耗時。spa

可是當沒有使用持久化連接模式和sql語句執行完以後,都關閉了mysql鏈接,可是會看到大量的sleep進程,當系統在高併發的時候,這個是一個很可怕的問題。由於大量的sleep進程致使到達了系統的最大鏈接數,形成不少用戶在排隊等待的狀態,系統會直接被拖垮。命令行

那是什麼狀況下會形成那麼多的sleep進程在執行完後沒有釋放呢?又有什麼辦法處理這些問題呢?code

形成這個問題的最主要因素就是 wait_timeout 參數的設置,默認值爲 8小時 28800秒,就是sql語句在正常執行完後,須要等待 28800秒後,該進程纔會被釋放,在高併發的時候,這個參數是重要設置指標。你們能夠針對系統和業務場景設置wait_timeout這個值。
若是沒有權限或者特殊狀況設置這個值,也能夠在程序中,根據須要,order by time的時間大小來 kill 一些時間過長的進程釋放掉。

Info 字段:這個字段會看到 執行的sql語句,在結合 Command 和 Time 字段,分析這個語句是否存在問題,若是 Command 是 query 狀態而 Time 的時間又很長,那就證實是一個問題sql,查詢慢的sql,要進行優化。

相關文章
相關標籤/搜索