當感覺mysql效能出現問題時,通常會先看下當前mysql的執行狀態,使用 show processlist 來檢視,例如
mysql> show processlist;
| id | user | host | db | command | time| state | info
|207|root |192.168.0.2:51621 |mytest | sleep | 5 | | null
|208|root |192.168.0.2:51622 |mytest | sleep | 5 | | null
|220|root |192.168.0.2:51676 |mytest |query | 84 | locked |
其中state狀態列資訊非常重要,先看下各列含義,然後看下state常用狀態
各列的含義
id乙個標識,你要kill乙個語句的時候使用,例如 mysql> kill 207;
user
顯示當前使用者,如果不是root,這個命令就只顯示你許可權範圍內的sql語句
host
顯示這個語句是從哪個ip 的哪個埠上發出的,可用來追蹤出問題語句的使用者
db顯示這個程序目前連線的是哪個資料庫
command
顯示當前連線的執行的命令,一般就是休眠(sleep),查詢(query),連線(connect)
time
此這個狀態持續的時間,單位是秒
state
顯示使用當前連線的sql語句的狀態,很重要的列,state只是語句執行中的某乙個狀態,例如查詢,需要經過copying to tmp table,sorting result,sending data等狀態才可以完成
info
顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是乙個判斷問題語句的重要依據
state 常見狀態分析
sleep
通常代表資源未釋放,如果是通過連線池,sleep狀態應該恆定在一定數量範圍內
例如資料查詢時間為0.1秒,而網路輸出需要1秒左右,原本資料連線在0.1秒即可釋放,但是因為前端程式未執行close操作,直接輸出結果,那麼在結果未展現在使用者桌面前,該資料庫連線一直維持在sleep狀態
locked
操作被鎖定,通常使用innodb可以很好的減少locked狀態的產生
copy to tmp table
索引及現有結構無法涵蓋查詢條件時,會建立乙個臨時表來滿足查詢要求,產生巨大的i/o壓力
copy to tmp table通常與連表查詢有關,建議減少關聯查詢或者深入優化查詢語句
如果出現此狀態的語句執行時間過長,會嚴重影響其他操作,此時可以kill掉該操作
sending data
sending data並不是傳送資料,是從物理磁碟獲取資料的程序,如果你的影響結果集較多,那麼就需要從不同的磁碟碎片去抽取資料
如果sending data連線過多,通常是某查詢的影響結果集過大,也就是查詢的索引項不夠優化
storing result to query cache
如果頻繁出現此狀態,使用set profiling分析,如果存在資源開銷在sql整體開銷的比例過大(即便是非常小的開銷,看比例),則說明query cache碎片較多,使用flush query cache可即時清理,query cache引數可適當酌情設定
mysql 語句分析 MySQL語句執行分析
今天客戶那邊遇到乙個問題 多選檔案進行操作,資料量一大後台處理就特別慢,瀏覽器顯示504超時。為了驗證問題是否出在sql語句,所以用以下方法來分析 查詢sql執行記錄 explain 分析 mysql 語句執行時間 下面會分別介紹三個方法的開啟方法。查詢sql執行記錄 查詢日誌功能是否開啟 show...
mysql的語句執行過程 Mysql語句執行過程
昨天老大問了我個問題,說一條 在低層的時候是怎麼執行的,發生了什麼 首先使用者通過各種鏈結連線到我們的 伺服器 但是這些鏈結需要等待伺服器的空閒程序來處理 所以當伺服器接到一條 後會做很多分解動作 首先在快取裡查詢快取中是否有需要的資料表,如果有並且可以用那麼就不執行後面的動作了,直接返回給使用者 ...
mysql索引執行計畫 MySQL索引及執行計畫
mysql索引及執行計畫 索引合理的建立索引可以加快資料查詢,例如,學校圖書管為每一本書編號,根據編號可以快速鎖定一本書所在位置。mysql索引預設b 樹索引。索引雖然能夠提高檢索效率,但同時也會降低更新的速度,因為insert update delete也會操作索引檔案,會調整因為更新等操作帶來的...