注意
:使用數據庫可視化工具Navicat查詢出來的參數居然跟直接xshell查出來的參數不同,Navicat的版本是11.2.7-premium
,因此修改參數仍是在命令行修改,比較準確。show profiles
命令是在MySQL5.0之後才新加入的,是一個語句分析的利器。
首先查看是否支持該功能。sql
show variables like 'have_profiling';
+----------------+-------+ | Variable_name | Value | +----------------+-------+ | have_profiling | YES | +----------------+-------+
默認是關閉的,開啓該功能。shell
set profiling=on;
查看開啓狀態。15表示歷史緩存sql的個數。數據庫
show variables like 'profiling%';
+------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | profiling | ON | | profiling_history_size | 15 | +------------------------+-------+
接下來隨便運行幾條sql,並使用 show profiles 命令,將展現剛纔運行的SQL語句。參數很好理解,不作解釋了。緩存
+----------+------------+----------------------------------+ | Query_ID | Duration | Query | +----------+------------+----------------------------------+ | 1 | 0.00106200 | show variables like 'profiling%' | | 2 | 0.00044400 | select * from t_logs | | 3 | 0.00019350 | select * from t_commonts | | 4 | 0.00043725 | select * from t_comments | +----------+------------+----------------------------------+
下面分析指定的SQL語句,使用以下命令(4是上面查出來的Query_ID,cpu和block io表明cpu的處理時間和io的時間):網絡
若是cpu時間慢,表示cpu的佔用率比較高,io慢的話,表示內存佔用率比較高。工具
show profile cpu,block io for query 4;
+----------------------+----------+----------+------------+--------------+---------------+ | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | +----------------------+----------+----------+------------+--------------+---------------+ | starting | 0.000072 | 0.000032 | 0.000033 | 0 | 0 | | checking permissions | 0.000008 | 0.000003 | 0.000004 | 0 | 0 | | Opening tables | 0.000022 | 0.000011 | 0.000011 | 0 | 0 | | init | 0.000038 | 0.000038 | 0.000000 | 0 | 0 | | System lock | 0.000009 | 0.000009 | 0.000000 | 0 | 0 | | optimizing | 0.000005 | 0.000005 | 0.000000 | 0 | 0 | | statistics | 0.000014 | 0.000014 | 0.000000 | 0 | 0 | | preparing | 0.000011 | 0.000010 | 0.000000 | 0 | 0 | | executing | 0.000003 | 0.000003 | 0.000000 | 0 | 0 | | Sending data | 0.000209 | 0.000209 | 0.000000 | 0 | 0 | | end | 0.000004 | 0.000004 | 0.000000 | 0 | 0 | | query end | 0.000007 | 0.000006 | 0.000000 | 0 | 0 | | closing tables | 0.000009 | 0.000009 | 0.000000 | 0 | 0 | | freeing items | 0.000017 | 0.000017 | 0.000000 | 0 | 0 | | cleaning up | 0.000011 | 0.000011 | 0.000000 | 0 | 0 | +----------------------+----------+----------+------------+--------------+---------------+
其中cpu和block io兩個參數比較重要,還有其餘參數,以下:性能
type | desc |
---|---|
ALL | 顯示全部的開銷信息 |
BLOCK IO | 顯示與IO相關的開銷 |
CONTEXT SWITCHES | 上下文切換相關開銷 |
CPU | 與CPU相關的開銷 |
IPC | 顯示發送和接受相關的開銷信息 |
MEMORY | 顯示內存相關的開銷信息 |
PAGE FAULTS | 顯示頁面錯誤相關開銷信息 |
SOURCE | 顯示和Source_function,SOURCE_file,SOURCE_line 相關的開銷信息 |
SWAPS | 顯示交換次數相關的開銷信息 |
在show profile 的時候有一個字段叫status,幾個重要的參數以下:命令行
狀態 | 描述 |
---|---|
System lock | 確認是因爲哪一個鎖引發的,一般是由於MySQL或InnoDB內核級 的鎖引發的建議:若是耗時較大再關注便可,通常狀況下都還好 |
Sending data | 從server端發送數據到客戶端,也有多是接收存儲引擎層返回的數據 再發送給客戶端,數據量很大時尤爲常常能看見, 備註:Sending Data不是網絡發送,是從硬盤讀取,發送到網絡是 Writing to net。建議:經過索引或加上LIMIT,減小須要掃描而且發送 給客戶端的數據量 |
Sorting result | 正在對結果進行排序,相似Creating sort index,不過是正常表, 而不是在內存表中進行排序建議:建立適當的索引 |
Table lock | 表級鎖,沒什麼好說的,要麼是由於MyISAM引擎表級鎖, 要麼是其餘狀況顯式鎖表 |
create sort index | 當前的SELECT中須要用到臨時表在進行ORDER BY排序。 建議:建立適當的索引 |
checking query cache for querychecking privileges on cachedsending cached result to clienstoring result in query cache |
和query cache相關的狀態,已經屢次強烈建議關閉 |
除了上述幾個字段,若是Status出現了以下幾個字段,說明SQL性能問題很嚴重。code