MySQL效能分析工具之PROFILE

甲骨文技術支援發表於2017-03-07
分析SQL執行帶來的開銷是最佳化SQL的常用手段,在MySQL資料庫中,可以透過配置profiling引數來啟用SQL剖析。
它只能在session級別來設定,設定後影響當前session;當它開啟後,後續執行的SQL語句都將記錄其資源開銷,諸如IO,上下文,CPU,MEMORY等。

實驗環境:
  1. mysql> select version();
  2. +------------+
  3. | version() |
  4. +------------+
  5. | 5.7.17-log |
  6. +------------+
  7. 1 row in set (0.00 sec)
與profile相關的三個引數:

  1. mysql> show variables like '%profil%';
  2. +------------------------+-------+
  3. | Variable_name | Value |
  4. +------------------------+-------+
  5. | have_profiling | YES |                  ---用於控制是否由系統變數開啟或禁用profiling
  6. | profiling | OFF |                       ---開啟SQL語句剖析功能
  7. | profiling_history_size | 15 |           ---設定保留profiling的數目,預設為15,範圍為0至100,為0時將禁用profiling
  8. +------------------------+-------+
  9. 3 rows in set (0.01 sec)
開啟profiling,有個警告,這個引數在以後會被刪除,用information_scheam.PROFILING替代。

  1. mysql> set profiling=1;
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)

  3. mysql> show warnings;
    +---------+------+----------------------------------------------------------------------+
    | Level   | Code | Message                                                              |
    +---------+------+----------------------------------------------------------------------+
    | Warning | 1287 | '@@profiling' is deprecated and will be removed in a future release. |
    +---------+------+----------------------------------------------------------------------+
執行一條sql測試一下:

  1. select * from oms3.customers where `type` = 1 AND `status` < 7 AND `isarea` = 6 AND `into_time`>='2016-12-01'AND `into_time`<='2017-01-02 23:59:59' order by score desc limit 40,20
sql執行很慢,執行完成之後檢視:
  1. mysql> show profiles;
  2. +----------+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | Query_ID | Duration | Query |
  4. +----------+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | 7 | 0.00022275 | SELECT * FROM setup_actors |
  6. | 8 | 0.00016050 | SELECT DATABASE() |
  7. | 9 | 0.00032350 | show databases |
  8. | 10 | 0.00024050 | show tables |
  9. | 11 | 0.00019250 | SELECT * FROM setup_actors |
  10. | 12 | 0.00183950 | show variables like "profiling_hist%" |
  11. | 13 | 0.00192500 | show variables like '%profil%' |
  12. | 14 | 0.00011550 | show warnings |
  13. | 15 | 0.00044725 | help 'show profile' |
  14. | 16 | 0.00013875 | set profiling=1 |
  15. | 17 | 0.00011550 | show warnings |
  16. | 18 | 0.00025075 | select * from customers where `type` = 1 AND `status` < 7 AND `isarea` = 6 AND `into_time`>='2016-12-01'AND `into_time`<='2017-01-02 23:59:59' order by score desc limit 40,20 |
  17. | 19 | 333.19133875 | select * from oms3.customers where `type` = 1 AND `status` < 7 AND `isarea` = 6 AND `into_time`>='2016-12-01'AND `into_time`<='2017-01-02 23:59:59' order by score desc limit 40,20 |
  18. | 20 | 0.00011250 | show profilings |
  19. | 21 | 0.00010975 | show profilings |
  20. +----------+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  21. 15 rows in set, 1 warning (0.00 sec)

  22. mysql> set @query_id=19;                ---上面顯示是query_id為19
  23. Query OK, 0 rows affected (0.00 sec)

  24. mysql> select STATE,sum(duration) as Total_R,          ---用這條sql查詢具體是哪裡出問題,這條sql引用於《High Performance MySQL,Third Edition》
  25.     -> ROUND(
  26.     -> 100*SUM(DURATION)/
  27.     -> (SELECT SUM(DURATION) FROM INFORMATiON_SCHEMA.PROFILING WHERE QUERY_ID=@query_id),2) as Pct_R,
  28.     -> count(*) as calls,
  29.     -> sum(duration)/count(*) as "R/Call"
  30.     -> from information_schema.profiling
  31.     -> where query_id=@query_id
  32.     -> group by state
  33.     -> order by Total_R desc;
  34. +----------------------+------------+-------+-------+----------------+
  35. | STATE | Total_R | Pct_R | calls | R/Call |
  36. +----------------------+------------+-------+-------+----------------+
  37. | Sending data | 332.162424 | 99.69 | 1 | 332.1624240000 |         ---這個state基本佔用了全部的資源,那麼對這條sql的最佳化就著重於減少io上。
  38. | statistics | 1.027729 | 0.31 | 1 | 1.0277290000 |
  39. | Opening tables | 0.000519 | 0.00 | 1 | 0.0005190000 |
  40. | freeing items | 0.000157 | 0.00 | 1 | 0.0001570000 |
  41. | starting | 0.000147 | 0.00 | 1 | 0.0001470000 |
  42. | init | 0.000123 | 0.00 | 1 | 0.0001230000 |
  43. | logging slow query | 0.000096 | 0.00 | 1 | 0.0000960000 |
  44. | preparing | 0.000035 | 0.00 | 1 | 0.0000350000 |
  45. | cleaning up | 0.000019 | 0.00 | 1 | 0.0000190000 |
  46. | optimizing | 0.000016 | 0.00 | 1 | 0.0000160000 |
  47. | end | 0.000014 | 0.00 | 1 | 0.0000140000 |
  48. | System lock | 0.000014 | 0.00 | 1 | 0.0000140000 |
  49. | closing tables | 0.000013 | 0.00 | 1 | 0.0000130000 |
  50. | query end | 0.000013 | 0.00 | 1 | 0.0000130000 |
  51. | Sorting result | 0.000010 | 0.00 | 1 | 0.0000100000 |
  52. | checking permissions | 0.000009 | 0.00 | 1 | 0.0000090000 |
  53. | executing | 0.000003 | 0.00 | 1 | 0.0000030000 |
  54. +----------------------+------------+-------+-------+----------------+
  55. 17 rows in set, 18 warnings (0.00 sec)
其他用法:
  1. mysql> SHOW PROFILE CPU FOR QUERY 2;
  2. +----------------------+----------+----------+------------+
  3. | Status | Duration | CPU_user | CPU_system |
  4. +----------------------+----------+----------+------------+
  5. | checking permissions | 0.000040 | 0.000038 | 0.000002 |
  6. | creating table | 0.000056 | 0.000028 | 0.000028 |
  7. | After create | 0.011363 | 0.000217 | 0.001571 |
  8. | query end | 0.000375 | 0.000013 | 0.000028 |
  9. | freeing items | 0.000089 | 0.000010 | 0.000014 |
  10. | logging slow query | 0.000019 | 0.000009 | 0.000010 |
  11. | cleaning up | 0.000005 | 0.000003 | 0.000002 |
  12. +----------------------+----------+----------+------------+
更多用法詳見:

  1. help show profiles;
總結:

上面說到這個引數以後會被廢棄,但是我覺得任重而道遠,因為現在information_scheam.PROFILING表裡連具體執行的sql都沒記錄......

PS:關於上面那條慢SQL的最佳化,請看我另一篇部落格:http://blog.itpub.net/20893244/viewspace-2134636/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20893244/viewspace-2134879/,如需轉載,請註明出處,否則將追究法律責任。

相關文章