MySQL profiling中要關(guān)注哪些信息

2018-07-31 19:01 更新

利用MySQL的PROFILE功能,我們可以很方便的查看一個SQL具體的執(zhí)行代價是怎樣的,尤其是可以分析它的最大瓶頸在哪里。目前PROFILE功能可提供除了內(nèi)存以外的其他資源消耗統(tǒng)計,例如CPU、I/O、CONTEXT、SWAP等。

PROFILE功能只能在SESSION級別使用,還做不到像SQL Server那樣可以全局開啟,收集一段時間后再關(guān)閉,這點有待改進。關(guān)于PROFILE的具體用法大家可以查看手冊 13.7.5.31 SHOW PROFILE Syntax,這里不細說。

大部分情況下,PROFILE的結(jié)果我們主要關(guān)注兩列:Status、Duration,前者表示的是PROFILE里的狀態(tài),它和PROCESSLIST的狀態(tài)基本是一致的,后者是該狀態(tài)的耗時。因此,我們最主要的是關(guān)注處于哪個狀態(tài)耗時最久,這些狀態(tài)中,哪些可以進一步優(yōu)化。

和我們之前的一個分享 [MySQL FAQ]系列 — processlist中哪些狀態(tài)要引起關(guān)注 類似,PROFILE中,下面幾種狀態(tài)是要尤其關(guān)注的,而且大多數(shù)通過創(chuàng)建合適的索引就可以完成優(yōu)化。

Status 建議
System lock 確認是由于哪個鎖引起的,通常是因為MySQL或InnoDB內(nèi)核級的鎖引起的建議:如果耗時較大再關(guān)注即可,一般情況下都還好
Sending data 從server端發(fā)送數(shù)據(jù)到客戶端,也有可能是接收存儲引擎層返回的數(shù)據(jù),再發(fā)送給客戶端,數(shù)據(jù)量很大時尤其經(jīng)常能看見(備注:Sending Data不是網(wǎng)絡發(fā)送,是從硬盤讀取,發(fā)送到網(wǎng)絡是Writing to net 建議:通過索引或加上LIMIT,減少需要掃描并且發(fā)送給客戶端的數(shù)據(jù)量)
Sorting result 正在對結(jié)果進行排序,類似Creating sort index,不過是正常表,而不是在內(nèi)存表中進行排序(建議:創(chuàng)建適當?shù)乃饕?/td>
Table lock 表級鎖,沒什么好說的,要么是因為MyISAM引擎表級鎖,要么是其他情況顯式鎖表
create sort index 當前的SELECT中需要用到臨時表在進行ORDER BY排序(建議:創(chuàng)建適當?shù)乃饕?/td>
checking query cache for querychecking privileges on cachedsending cached result to clien storing result in query cache 和query cache相關(guān)的狀態(tài),已經(jīng)多次強烈建議關(guān)閉

更多狀態(tài)請移步之前的分享文章 [MySQL FAQ]系列 — processlist中哪些狀態(tài)要引起關(guān)注 以及官方文檔 8.14.2 General Thread States,如果有未涉及想了解的狀態(tài),也請在評論區(qū)給我留言,謝謝。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號