-
- 性能優化的思路
- 首先需要使用慢查詢功能,去獲取所有查詢時間比較長的SQL語句
- 其次使用explain命令去查看有問題的SQL的執行計劃
- 最後可以使用show profile[s] 查看有問題的SQL的性能使用情況
- 介紹
- 數據庫查詢快慢是影響項目性能的一大因素,對於數據庫,我們除了要優化 SQL,更重要的是得先找到需要優化的 SQL。
- MySQL 數據庫有一個“慢查詢日誌”功能,用來記錄查詢時間超過某個設定值的SQL,這將極大程度幫助我們快速定位到癥結所在,以便對症下藥。
* 至於查詢時間的多少纔算慢,每個項目、業務都有不同的要求。
* 傳統企業的軟件允許查詢時間高於某個值,但是把這個標準放在互聯網項目或者訪問量大的網站上,估計就是一個bug,甚至可能升級爲一個功能性缺陷。
- MySQL的慢查詢日誌功能,默認是關閉的,需要手動開啓。
- 開啓慢查詢功能
- 查看是否開啓慢查詢功能
參數說明:
* slow_query_log :是否開啓慢查詢日誌,ON 爲開啓,OFF 爲關閉,如果爲關閉可以開啓。
* log-slow-queries :舊版(5.6以下版本)MySQL數據庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log
* slow-query-log-file:新版(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]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
- 慢日誌格式
格式說明:
* 第一行,SQL查詢執行的時間
* 第二行,執行SQL查詢的連接信息,用戶和連接IP
* 第三行,記錄了一些我們比較有用的信息,如下解析
Query_time,這條SQL執行的時間,越長則越慢
Lock_time,在MySQL服務器階段(不是在存儲引擎階段)等待表鎖時間
Rows_sent,查詢返回的行數
Rows_examined,查詢檢查的行數,越長就當然越費時間
* 第四行,設置時間戳,沒有實際意義,只是和第一行對應執行時間。
* 第五行及後面所有行(第二個# Time:之前),執行的sql語句記錄信息,因爲sql可能會很長。
-
- 分析慢查詢日誌
- MySQL自帶的mysqldumpslow
- 分析慢查詢日誌
[root@localhost mysql]# mysqldumpslow /var/lib/mysql/localhost-slow.log
常用參數說明:
- -s:是表示按照何種方式排序
- -t:是top n的意思,即爲返回前面多少條的數據
- -g:後邊可以寫一個正則匹配模式,大小寫不敏感的
示例:
得到按照時間排序的前10條裏面含有左連接的查詢語句。
mysqldumpslow -s t -t 10 -g “left join” /var/lib/mysql/localhost_slow.log
-
-
- 使用mysqlsla 工具
-
- mysqlsla工具,功能非常強大。數據報表,非常有利於分析慢查詢的原因,包括執行頻率,數據量,查詢消耗等。
- 不過此工具已停止維護,項目 github 介紹頁面推薦使用 percona-toolkit,下面有介紹。
mysqlsla -lt /var/log/mysql/slow.log
-
-
- 使用percona-toolkit工具
-
percona-toolkit是一組高級命令行工具的集合,可以查看當前服務的摘要信息,磁盤檢測,分析慢查詢日誌,查找重複索引,實現表同步等等。
- 下載
- 安裝
* tar -xf percona-toolkit-3.0.11_x86_64.tar.gz
* cd percona-toolkit-3.0.11
* perl Makefile.PL
* make
* make install
- 調錯
Can't locate ExtUtils/MakeMaker.pm in @INC 錯誤的解決方式:
* yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
Can't locate Time/HiRes.pm in @INC
* yum install -y perl-Time-HiRes
- 使用pt-query-digest查看慢查詢日誌
pt-query-digest /var/lib/mysql/localhost-slow.log