性能優化的思路
- 首先須要使用慢查詢功能,去獲取全部查詢時間比較長的SQL語句
- 其次使用explain命令去查詢由問題的SQL的執行計劃(腦補連接:點我直達1,點我直達2)
- 最後可使用show profile[s] 查看由問題的SQL的性能使用狀況
- 優化SQL語句
介紹
數據庫查詢快慢是影響項目性能的一大因素,對於數據庫,咱們除了要優化SQL,更重要的是得先找到須要優化的SQL語句。html
MySQL數據庫有一個「慢查詢日誌」功能,用來記錄查詢時間超過某個設定值的SQL,這將極大程度幫助咱們快速定位到問題所在,以便對症下藥。mysql
至於查詢時間的多少纔算慢,每一個項目、業務都有不一樣的要求。
好比傳統企業的軟件容許查詢時間高於某個值,可是把這個標準方在互聯網項目或者訪問量大的網站上,估計就是一個Bug,甚至可能升級爲一個功能缺陷。
MySQL的慢查詢日誌功能,默認是關閉的,須要手動開啓。sql
開啓慢查詢功能
查看是否開啓慢查詢功能
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
參數說明:數據庫
- slow_query_log:是否開啓慢查詢,on爲開啓,off爲關閉;
- log-slow-queries:舊版(5.6如下版本)MySQL數據庫慢查詢存儲路徑,能夠不設置該參數,系統則會給一個缺省的文件:host_name-slow.log
- long_query_time:慢查詢閥值,當查詢時間多於設置的閥值時,記錄日誌,單位爲秒。
臨時開啓滿查詢功能
在MySQL執行SQL語句設置,可是若是重啓MySQL的話會失效。性能優化
set global slow_query_log=on;
set global long_query_time=1;
永久性開啓慢查詢
修改:/etc/my.cnf,添加如下內容,而後重啓MySQL服務服務器
[mysqld]
lower_case_table_names=1
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/chenyanbindeMacBook-Pro-slow.log
long_query_time=1
![](http://static.javashuo.com/static/loading.gif)
查看滿查詢啓動狀態
![](http://static.javashuo.com/static/loading.gif)
演示慢查詢
爲了演示方便,咱們讓sql睡眠3秒!session
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
格式說明:工具
- 第一行,SQL查詢執行的具體時間
- 第二行,執行SQL查詢的鏈接信息,用戶和鏈接IP
- 第三行,記錄了一些咱們比較有用的信息,
- Query_timme,這條SQL執行的時間,越長則越慢
- Lock_time,在MySQL服務器階段(不是在存儲引擎階段)等待表鎖時間
- Rows_sent,查詢返回的行數
- Rows_examined,查詢檢查的行數,越長就越浪費時間
- 第四行,設置時間戳,沒有實際意義,只是和第一行對應執行時間。
- 第五行,執行的SQL語句記錄信息
分析滿查詢日誌
MySQL自帶的mysqldumpslow
![](http://static.javashuo.com/static/loading.gif)
參數說明:性能
- -s, 是表示按照何種方式排序,c、t、l、r分別是按照記錄次數、時間、查詢時間、返回的記錄數來排序,ac、at、al、ar,表示相應的倒敘;
- -t, 是top n的意思,即爲返回前面多少條的數據;
- -g, 後邊能夠寫一個正則匹配模式,大小寫不敏感的;
MySQL性能fenix語句show profile(重要)
介紹
- Query Profiler是MySQL自帶的一種query診斷分析工具,經過它能夠分析出一條SQL語句性能瓶頸在什麼地方。
- 一般使用explain,以及slow query log都沒法作到精確分析,可是Query profiler卻能夠定位出一條SQL執行的各類資源消耗狀況,好比CPU、IO等,以及該SQL執行所耗費的時間等。不過該工具只有在MySQL5.0.37以上版本中才有實現
- 默認的狀況下,MySQL的該功能沒有打開,須要本身手動打開
語句使用
- show profile和show profiles語句能夠展現當前會話(退出session後,profiling重置爲0)中執行語句的資源使用狀況。
- show profiles:以列表形式顯示最近發送到服務器上執行的語句的資源使用狀況,顯示的記錄數由變量:profiling_history_size控制,默認15條
- show profile:只是最近一條語句執行的消息資源佔用信息,默認實現Status和Duration兩列
開啓Profile功能
- Profile功能由MySQL會話變量:profiling控制,默認是OFF關閉狀態。
- 查看是否開啓了Profile功能
select @@profiling;
show variables like '%profil%';
![](http://static.javashuo.com/static/loading.gif)
打開profiling功能優化
![](http://static.javashuo.com/static/loading.gif)
show profile用法
SHOW PROFILE [type [, type] …… ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]]
type: { ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS }
![](http://static.javashuo.com/static/loading.gif)