1. 程式人生 > >MySQL之效能優化

MySQL之效能優化

MySQL效能的指標是指響應時間。對效能的剖析包括對應用程式的剖析和對MySQL查詢的剖析。

剖析應用程式

一種比較好的對應用程式進行效能優化工具New Relic,在收藏中有安裝步驟。該工具不僅對資料庫,還能對整個系統進行監控,即使不能給出優化方案,也能定位問題所在。

剖析MySQL

對MySQL查詢的剖析應自上而下進行,即剖析整個資料庫伺服器,定位到具體壓力來源的查詢,再單獨剖析具體查詢,分析哪些子任務是響應時間的主要消耗者。 對於資料庫伺服器,一般採用慢查詢日誌進行剖析,但由於某些原因如許可權不足等,無法在伺服器上記錄查詢,因此可以採用如下方法:

  1. 使用pt-query-digest的–processlist選項不斷檢視SHOW FULL PROCESSLIST的輸出,問題是有可能無法捕捉所有的查詢。
  2. 使用tcpdump抓去網路包資料,再用pt-query-digest的–type=tcpdump選項解析並分析查詢網路包資料,解決了上一問題,並且精度較高。

對於單獨查詢進行剖析,首先使用SHOW PROFILE定位耗時多的操作,步驟如下:

  1. 設定會話級的查詢剖析:set profiling = 1;
  2. 使用查詢語句進行查詢,該語句即是需要被剖析的物件。
  3. 檢視剖析結果:show profiles;
  4. 檢視詳細的剖析結果:show profile for query 5; 5代表查詢ID,來源於步驟3。
  5. 由於步驟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獲取更加詳細的資訊。

診斷間歇性問題

間歇性問題如系統偶爾停頓或慢查詢,很難診斷,也很難重現。一般步驟包括:

  1. 使用工具準確描述問題:show global status,show processlist,查詢日誌等。
  2. 使用工具捕獲診斷資料:通過pt-stalk建立觸發器的監控變數、閾值、檢查頻率等,然後呼叫pt-collect收集資料。系統中應提前安裝好gdb(堆疊跟蹤工具)、oprofile(伺服器診斷工具)和MySQL的debuginfo包(符號資訊)。
  3. 正確地解釋結果資料:通過對上述各個工具收集到的資料,進行兩種關注性地條理查詢。兩個重要的關注包括,主觀上假設和猜測的關注,客觀上基於合理性和基於可度量的的方式的關注。

堅持信念,工作系統是某種狀態機,只要有足夠的耐心和細心,邏輯清晰並堅持下去,通常就能得到想要的結果。