首先須要使用慢查詢功能,去獲取全部查詢時間比較長的SQL語句mysql
使用explain去查看該sql的執行計劃sql
數據庫
數據庫的查詢速度是影響項目性能的重要因素,除了添加緩存中間件外,對於查詢自己的優化帶來的性能也是不容小覷segmentfault
要想優化查詢SQL,就應該先找打須要被優化的SQL語句,MySQL提供了這麼一個功能能夠幫助咱們快速定位帶查詢慢的SQL緩存
MySQL的慢查詢日誌功能:默認關閉,須要手動開啓性能優化
查看是否開啓慢查詢日誌功能:show variables like '%slow_query%';服務器
工具
slow-query-log-file:新版(5.6及以上版本)MySQL數據庫慢查詢日誌存儲路徑。能夠不設置該參數,系統則會默認給一個缺省的文件 host_-slow.log性能
下面咱們開啓慢查詢日誌功能:測試
長期有效(修改 :/etc/my.cnf配置文件以下 記得重啓mysql生效)
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
臨時開啓,重啓後失效:(測試用)
set global slow_query_log = ON; (開啓)
set global long_query_time = 1; (便於測試,設置閥值,後面我改的是配置文件爲0.1)
咱們顯示查詢慢查詢的閥值,也就是sql執行時間超過該值就會被記錄,單位秒,咱們能夠看到是10秒
咱們已經開啓了慢查詢日誌功能,並設置相應的閥值,下面咱們來測試一下:
能夠看到已經生效了,可是中途其實仍是出了點小問題,好比在設置閥值的時候失效了,沒有設置上,在好比慢查詢日誌沒有寫入文件;
上面的日誌重要部分解析:
Query_time:這條sql執行的時間
Lock_time:在Mysql服務器階段等待表鎖時間
Rows_sent:查詢返回的行數
Rows_examined:查詢檢查的行數,越長查詢的時間越長
(如有侵權,請聯繫刪除)
在上面的慢查詢中,咱們已經將查詢時間超過閥值的sql語句過濾了出來,下面咱們來具體分析分析是哪裏出了問題
Query Profile是MySQL自帶的一種Query診斷分析工具,能夠完整的顯示一條sql執行的各方面的詳細信息,默認關閉;
查看是否開啓Profile功能:
select @@profiling;
show variables like '%profil%';
能夠看到 profiling爲 OFF,profiling爲0,表示關閉狀態,下面咱們將其開啓:set profiling=1; (1:開 / 0:關)
再次查看是否打開性能分析工具:select@@profiling; (以前爲0)
下面咱們開始準備測試:
第一個被圈中的是咱們要執行的測試sql語句
第二個被圈中的是:以列表形式顯示最近發送到服務器上執行的語句的資源使用狀況
第三個被圈中的是:咱們剛剛發送到服務器上執行的語句
下面咱們就來看看這條語句的一些信息: show profile for query 4;
這個4就是上面 show profiles中的Query_ID 咱們的測試sql爲4
見名知意,對於這條簡單的sql而言,可見在剛開始創建鏈接時和最後返回數據時,所佔的時間比列多很大
因此,有鏈接池和只返回咱們須要的數據便可這麼些說法;
合理利用慢查詢日誌、explain執行計劃查詢、show profile查看SQL執行時的資源使用狀況。對須要優化的語句進行鍼對性的優化