MySQL 的性能-SQL 執行分析---執行時間分析


    Show profiles是5.0.37之后添加的,要想使用此功能,要確保版本在5.0.37之后。

     Query Profiler是MYSQL自帶的一種query診斷分析工具,通過它可以分析出一條SQL語句的性能瓶頸在什么地方。通常我們是使用的explain,以及slow query log都無法做到精確分析,

     但是Query Profiler卻可以定位出一條SQL語句執行的各種資源消耗情況,比如CPU,IO等,以及該SQL執行所耗費的時間等。

1.查看數據庫版本方法:show variables like "%version%";  或者  select version();

    

2.確定支持show profile 后,查看profile是否開啟,數據庫默認是不開啟的。變量profiling是用戶變量,每次都得重新啟用。

   查看方法: select @@profiling   # 0 代表還是關閉着分析功能,  1 代表開啟

 

   

  或者使用查看命令: show variables like "%pro%" ; 

    開啟profiling : set profiling = 1;

   

   再次查看show variables like "%pro%"; 已經是開啟的狀態了。

3.可以開始執行一些想要分析的sql語句了,執行完后,show profiles;即可查看所有sql的總的執行時間。

  

 語法:show profile for query Query_ID

 例:

 show profile for query 1

 

以上具體的信息都是從 INFORMATION_SCHEMA.PROFILING 這張表中取得的。這張表記錄了所有的各個步驟的執行時間及相關信息。

語法:  mysql> select * from INFORMATION_SCHEMA.PROFILING where query_id = Query_ID;

 

mysql> show profile cpu, block io, memory,swaps,context switches,source for query 6;   #可以查看出一條SQL語句執行的各種資源消耗情況,比如CPU,IO等

 

mysql> show profile all for query 6 查看第6條語句的所有的執行信息。

 測試完畢后,關閉參數:

mysql> set profiling=0


方法二: timestampdiff來查看執行時間。

這種方法有一點要注意,就是三條sql語句要盡量連一起執行,不然誤差太大,根本不准

set @d=now();
select * from comment;
select timestampdiff(second,@d,now());

如果是用命令行來執行的話,有一點要注意,就是在select timestampdiff(second,@d,now());后面,一定要多copy一個空行,不然最后一個sql要你自己按回車執行,這樣就不准了。

 

3.慢查詢日志
MySQL 的慢查詢日志,顧名思義就是把執行時間超過設定值(默認為10s)的 SQL 記錄到日志中。這項功能需要手動開啟,但是開啟后會造成一定的性能損耗。

 

3.1 查看慢日志是否開啟
默認情況下slow_query_log的值為OFF,表示慢查詢日志是禁用的,可以通過設置slow_query_log的值來開啟。語法:set global slow_query_log=1

mysql> show variables like '%slow_query_log%';
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+
2 rows in set (0.11 sec)

mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.03 sec)

mysql> show variables like '%slow_query_log%';
+---------------------+------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /usr/local/var/mysql/xueweihandeMacBook-Air-slow.log |
+---------------------+------------------------------------------------------+


3.2 設置超時時間
設置語法:set global long_query_time=4
查看語法:show variables like ‘long_query_time’
注意:修改后,需要重新連接或新開一個會話才能看到修改值。

永久生效,修改 my.cnf

slow_query_log=1
long_query_time=10
slow_query_log_file=/path/mysql_slow.log


3.3 其他參數

3.3.1 log_output
參數是指定日志的存儲方式。log_output=‘FILE’表示將日志存入文件,默認值是’FILE’。log_output='TABLE’表示將日志存入數據庫,這樣日志信息就會被寫入到mysql.slow_log表中。MySQL數據庫支持同時兩種日志存儲方式,配置的時候以逗號隔開即可,如:log_output=‘FILE,TABLE’。日志記錄到系統的專用日志表中,要比記錄到文件耗費更多的系統資源,因此對於需要啟用慢查詢日志,又需要能夠獲得更高的系統性能,那么建議優先記錄到文件。

3.3.2 log-queries-not-using-indexes
未使用索引的查詢也被記錄到慢查詢日志中(可選項)。如果調優的話,建議開啟這個選項。另外,開啟了這個參數,其實使用full index scan的sql也會被記錄到慢查詢日志。

3.3.3 log_slow_admin_statements
表示是否將慢管理語句例如ANALYZE TABLE和ALTER TABLE等記入慢查詢日志

3.4 分析工具 mysqldumpslow
MySQL 提供了慢日志分析工具 mysqldumpslow。

-s 表示按照何種方式排序;
c: 訪問計數
l: 鎖定時間
r: 返回記錄
t: 查詢時間
al:平均鎖定時間
ar:平均返回記錄數
at:平均查詢時間
-t 是top n的意思,即為返回前面多少條的數據;
-g 后邊可以寫一個正則匹配模式,大小寫不敏感的;

3.4.1 命令示例
得到返回記錄集最多的 10 個 SQL:mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到訪問次數最多的 10 個 SQL:mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照時間排序的前10條里面含有左連接的查詢語句:mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建議在使用這些命令時結合 | 和 more 使用 ,否則有可能出現刷屏的情況:mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM