MySQL從5.0.37起,提供了profile的功用,對功用調試極端有用. profile的功用首要用途是顯示 sql 執行的整個流程中各項資源的運用情況。剖析器可以更好的展現出不良 SQL 的功用疑問所在。
下面咱們舉例簡介一下 MySQL SQL Profiler 的運用方法:
最先,開啟 MySQL SQL Profiler
MySQL> SELECT @@profiling;
+――――-+
@@profiling
+――――-+
0
+――――-+
1 row in set (0.00 sec)
MySQL> SET profiling = 1;
Query OK, 0 rows affected (0.00 sec)
MySQL> SELECT @@profiling;
+――――-+
@@profiling
+――――-+
1
+――――-+
1 row in set (0.00 sec)
默許情況下 profiling 的值為 0 表示 MySQL SQL Profiler 處於 OFF 形態,開啟 SQL 功用剖析器後 profiling 的值為 1.
議決 sql 功用剖析器,咱們來比擬一下 下列語句前後 2 次執行流程的差異,對咱們明白 sql 的細致執行流程是十分有協助的。
MySQL> create table t_engines select * from t_engines1;
Query OK, 57344 rows affected (0.10 sec)
Records: 57344 Duplicates: 0 Warnings: 0
MySQL> select count(*) from t_engines;
+―――-+
count(*)
+―――-+
57344
+―――-+
1 row in set (0.00 sec)
MySQL> select count(*) from t_engines;
+―――-+
count(*)
+―――-+
57344
+―――-+
1 row in set (0.00 sec)
MySQL> SHOW PROFILES;
+―――-+――――+――――――――――――――――-+
Query_ID Duration Query
+―――-+――――+――――――――――――――――-+
26 0.10213775 create table t_engines select * from t_engines1
27 0.00032775 select count(*) from t_engines
28 0.00003850 select count(*) from t_engines
+―――-+――――+――――――――――――――――-+
15 rows in set (0.01 sec)
MySQL> SHOW PROFILE FOR QUERY 27;
+――――――――――C+――――+
Status Duration
+――――――――――C+――――+
(initialization) 0.00000425
checking query cache for query 0.00004050
checking permissions 0.00001050
Opening tables 0.00018250
System lock 0.00000450
Table lock 0.00001775
init 0.00001075
optimizing 0.00000550
executing 0.00002775
end 0.00000450
query end 0.00000325
storing result in query cache 0.00000400
freeing items 0.00000400
closing tables 0.00000500
logging slow query 0.00000300
+――――――――――C+――――+
15 rows in set (0.00 sec)
MySQL> SHOW PROFILE FOR QUERY 28;
+――――――――――――-+――――+
Status Duration
+――――――――――――-+――――+
(initialization) 0.00000350
checking query cache for query 0.00000750
checking privileges on cached query 0.00000500
checking permissions 0.00000525
sending cached result to clIEnt 0.00001275
logging slow query 0.00000450
+――――――――――――-+――――+
6 rows in set (0.00 sec)
MySQL> SELECT sum( FORMAT(DURATION, 6)) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID =27 ORDER BY SEQ;
+―――-+
DURATION
+―――-+
0.000326
+―――-+
1 row in set (0.00 sec)
MySQL> SELECT sum( FORMAT(DURATION, 6)) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID =28 ORDER BY SEQ;
+―――-+
DURATION
+―――-+
0.000039
+―――-+
1 row in set (0.00 sec)
MySQL>
從上面的例子中咱們可以明晰的看出 2 次執行 count 語句的差異, SHOW PROFILE FOR QUERY 27 展現的是第一次 count 統計的執行流程,包括了 Opening tables 、 Table lock 等操作 。而 SHOW PROFILE FOR QUERY 28 展現了第二次 count 統計的執行流程 , 第二次 count 直接從查詢緩存中前往 count 統計後果,議決比擬 2 次統計的總執行時間覺察,緩存讀的速度接近物理讀的 10 倍。議決運用 SQL 功用剖析器可以協助咱們對一些比擬難以確定功用疑問的 SQL 執行診斷,找出疑問本源。