SQL優化之慢查詢和explain以及性能分析

性能優化的思路

  • 首先須要使用慢查詢功能,去獲取全部查詢時間比較長的SQL語句mysql

  • 使用explain去查看該sql的執行計劃sql

  • 使用show profile去查看該sql執行時的性能問題數據庫

MySQL性能優化之慢查詢

數據庫的查詢速度是影響項目性能的重要因素,除了添加緩存中間件外,對於查詢自己的優化帶來的性能也是不容小覷segmentfault

要想優化查詢SQL,就應該先找打須要被優化的SQL語句,MySQL提供了這麼一個功能能夠幫助咱們快速定位帶查詢慢的SQL緩存

MySQL的慢查詢日誌功能:默認關閉,須要手動開啓性能優化

查看是否開啓慢查詢日誌功能:show variables like '%slow_query%';服務器

  • slow_query_log :是否開啓慢查詢日誌,ON 爲開啓,OFF 爲關閉,若是爲關閉能夠開啓工具

  • 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語句信息

MySQL性能優化之查看執行計劃:explain

(如有侵權,請聯繫刪除)

在上面的慢查詢中,咱們已經將查詢時間超過閥值的sql語句過濾了出來,下面咱們來具體分析分析是哪裏出了問題

MySQL性能分析語句show profile

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執行時的資源使用狀況。對須要優化的語句進行鍼對性的優化

相關文章
相關標籤/搜索