MySQL之效能優化
阿新 • • 發佈:2018-12-12
MySQL效能的指標是指響應時間。對效能的剖析包括對應用程式的剖析和對MySQL查詢的剖析。
剖析應用程式
一種比較好的對應用程式進行效能優化工具New Relic,在收藏中有安裝步驟。該工具不僅對資料庫,還能對整個系統進行監控,即使不能給出優化方案,也能定位問題所在。
剖析MySQL
對MySQL查詢的剖析應自上而下進行,即剖析整個資料庫伺服器,定位到具體壓力來源的查詢,再單獨剖析具體查詢,分析哪些子任務是響應時間的主要消耗者。 對於資料庫伺服器,一般採用慢查詢日誌進行剖析,但由於某些原因如許可權不足等,無法在伺服器上記錄查詢,因此可以採用如下方法:
- 使用pt-query-digest的–processlist選項不斷檢視SHOW FULL PROCESSLIST的輸出,問題是有可能無法捕捉所有的查詢。
- 使用tcpdump抓去網路包資料,再用pt-query-digest的–type=tcpdump選項解析並分析查詢網路包資料,解決了上一問題,並且精度較高。
對於單獨查詢進行剖析,首先使用SHOW PROFILE定位耗時多的操作,步驟如下:
- 設定會話級的查詢剖析:set profiling = 1;
- 使用查詢語句進行查詢,該語句即是需要被剖析的物件。
- 檢視剖析結果:show profiles;
- 檢視詳細的剖析結果:show profile for query 5; 5代表查詢ID,來源於步驟3。
- 由於步驟4得到表的內容按照執行順序排序,為了解那一步驟出現問題,需要編寫SQL指令碼格式化輸出。如下例所示:
set @query_id = 1; select state, sum(duration) as total_r, round( 100 * sum(duration) / select sum(duration) from information_schema.profiling where query_id = @query_id ), 2) as pct_r, count(*) as calls, sum(duration) / count(*) as "r/call" from information_profiling where query_id = @query_id group by state order by total_r desc;
然後,使用SHOW STATUS分析原因。注意show status和show global status的區別,前者在某些計數器上包含了後者。通過對show status的where選擇獲取所需的計數器,對其進行分析,但此分析大多數是推測性質的。在Percona Server中可以進一步通過show profile獲取更加詳細的資訊。
診斷間歇性問題
間歇性問題如系統偶爾停頓或慢查詢,很難診斷,也很難重現。一般步驟包括:
- 使用工具準確描述問題:show global status,show processlist,查詢日誌等。
- 使用工具捕獲診斷資料:通過pt-stalk建立觸發器的監控變數、閾值、檢查頻率等,然後呼叫pt-collect收集資料。系統中應提前安裝好gdb(堆疊跟蹤工具)、oprofile(伺服器診斷工具)和MySQL的debuginfo包(符號資訊)。
- 正確地解釋結果資料:通過對上述各個工具收集到的資料,進行兩種關注性地條理查詢。兩個重要的關注包括,主觀上假設和猜測的關注,客觀上基於合理性和基於可度量的的方式的關注。
堅持信念,工作系統是某種狀態機,只要有足夠的耐心和細心,邏輯清晰並堅持下去,通常就能得到想要的結果。