《Mysql實例mysql中開啟慢sql查詢(mysql慢查詢日志)的方法》要點:
本文介紹了Mysql實例mysql中開啟慢sql查詢(mysql慢查詢日志)的方法,希望對您有用。如果有疑問,可以聯系我們。
MYSQL數據庫對于mysql數據庫應用程序來說,查看慢SQL以優化數據庫操作是最基本的,對于以MySQL為DB的應用程序來說也不例外,本文就是以MySQL為例來介紹如何查看慢SQL的問題.
MYSQL數據庫在MySQL中,慢SQL就是指所有執行時間大于long_query_time的SQL語句,知道這些語句后,便可以進行相關優化了,比如:加索引、合并語句等.
MYSQL數據庫一、啟用慢SQL
1、查看慢SQL是否啟用
?
MYSQL數據庫上面語句能查看慢SQL是否啟用了,即Value為ON表示啟用了,為OFF表示禁用了.
?
MYSQL數據庫上面語句能查看執行慢于多少秒的SQL算慢SQL即會記錄到日志文件中,Value為10表示大于10秒的會記錄.
MYSQL數據庫2、開啟慢SQL
如果你的MySQL是源碼編譯的,那么慢SQL日志文件信息由編譯時指定,比如:一般將慢SQL日志文件放在/data/mysql/目錄下,文件名為hostname-slow.log.
如果你的MySQL是RPM安裝的,那么慢SQL日志文件信息由MySQL配置文件/etc/my.cnf指定,打開配置文件,找到[mysqld]區段,增加日志配置,具體如下:
?
MYSQL數據庫log指定MySQL日志文件存放路徑.
log_slow_queries指定慢SQL日志文件存放路徑,此目錄文件一定要有寫權限.
long_query_time指定大于多長時間算慢SQL,單位秒.
MYSQL數據庫注意,上述配置一定要加在[mysqld]后而不是[mysqld_safe]下面,否則不會生效.
配置完后,重啟MySQL即可:
?
MYSQL數據庫上面說明開啟了慢SQL,并且時間為2秒.
CD到目錄/var/lib/mysql/目錄下能看到自動創建了慢SQL日志文件hostname-slow.log.
cat hostname-slow.log會發現里面沒有記錄,簡單測試下:
?
MYSQL數據庫上面執行完了一個3秒的SQL語句,這時候打開慢SQL日志文件就能看到了.
當然除了上面的設置方式外,還可以在mysqld進程啟動時,通過參數指定選項,比如:--log-slow-queries[=file_name].
MYSQL數據庫二、慢SQL分析
慢SQL分析可以通過vi直接打開日志文件來做,但是這種方式還是比較原始,實際上慢SQL分析工具有很多種,常用的有如下幾款:
1、mysqldumpslow
這是MySQL官方提供的慢SQL日志分析工具,安裝好后,執行如下語句就能分析日志:
#mysqldumpslow /var/lib/mysql/hostname-slow.log
主要功能是統計不同慢SQL的如下指標:
count(出現次數)??? Time(執行最長時間/累計總耗費時間)??? Lock(等待鎖的時間S)??? Rows(發送給客戶端的總行數)??? 用戶及SQL語句
慢SQL日志文件有時候記錄數會比較多,那么mysqldumpslow提供了一些參數用于解決這些問題:
mysqldumpslow -s r -t 10 /var/lib/mysql/hostname-slow.log
上面命令會以查詢時間來排序并顯示前10條查詢,其中,參數s表示排序選項(c:查詢次數、r:返回記錄行數、t:查詢時間),參數t表示只顯示top n條查詢.
MYSQL數據庫2、mysqlsla
這是由hackmysql.com提供的一款日志分析工具,該網站還提供了mysqlreport、mysqlidxchk等實用的mysql工具值得學習.
安裝好后,執行如下命令就能分析日志了:
#mysqlsla -lt slow /var/lib/mysql/hostname-slow.log
該工具方便用戶分析慢查詢的原因,包括執行頻率、數據量、查詢消耗等,具體包含信息如下:
queries total(總查詢次數)???? unique(去重后的SQL數量)???
Sorted by(報表按照什么排序)
Gand Totals(慢SQL統計信息):Time(平均執行時間),Lock(等待鎖時間),Rows Sent(總行數),Rows Examined(總掃描行數)
Count(SQL執行次數及占總慢SQL數量的百分比)
Time(執行時間):包括總時間、最小/最大時間、時間占總慢SQL時間的百分比
Lock Time(等待鎖時間)
Rows Sent(行數統計):包括平均、最小/最大數量
Database(數據庫)
Users(用戶、IP、占所有用戶執行SQL的百分比)
Query abstract(抽象后的SQL語句)
Query sample(SQL語句例子)
MYSQL數據庫3、mysql-log-filter
google code上的開源分析工具,提供python和php兩種腳本,可以點擊這里下載.
執行如下命令就能分析日志:
#python mysql_filter_slow_log.py /var/lib/mysql/hostname-slow.log --no-duplicates --sort-execution-count --top=10
功能上類似于mysqldumpslow,但是多出了很多查詢時間的統計信息,包括平均、最大、累計等,此外,還對輸出內容排版和格式化.
MYSQL數據庫4、myprofi
sourceforge上提供的純php寫的開源分析工具,可以點擊這里下載.
執行如下命令就能分析日志:
#php parser.php -slow /var/lib/mysql/hostname-slow.log
執行上面命令后,會列出總的慢查詢次數和類型、去重后的SQL語句、執行次數及占總慢SQL數量的百分比.
myprofi的輸出比較簡潔,適合于只關心慢SQL語句及執行次數的同學.
MYSQL數據庫三、慢SQL優化
SQL優化是一門大工程,不敢狂言,在此只是表述我實際中遇到的問題及優化解決方案來以此達到拋磚引玉的效果.
1、索引問題
在一次壓力測試中,發現有一個70W記錄的流水表,由于沒有加索引導致在update時MySQL服務器CPU瞬間飆到170%,語句類似于下面:
update loginlog set LogoutTime=%lu where RoleName=%s and LoginTime=%lu
loginlog表的主鍵是自增ID.
對字段RoleName和LoginTime建索引后,問題解決了.
因此,對于操作頻繁的select、update、帶where的delete語句最好對where條件涉及的字段建索引,當然這也會給insert語句帶來一定的性能損失.
MYSQL數據庫2、聯合主鍵問題
在一次壓力測試中,在慢SQL日志中發現一條記錄:
?
MYSQL數據庫userrelation中FromRoleName與ToRoleName為聯合主鍵,但是上面的where語句中聯合主鍵并沒有達到效果.
這是因為,聯合主鍵在索引時,where條件對字段及順序有要求,比如:
?
MYSQL數據庫上述兩種情況都有效果.
為字段ToRoleName建立索引后,問題解決了.
MYSQL數據庫3、分頁問題
有時候會對表格記錄有limit操作的需求,這就涉及到分頁問題,這里貼一段我的DBA同事曾給我的一段關于分頁優化的建議吧:
(1)首次查詢的時候緩存結果.這樣情況就變得簡單了,無論是結果條目的數量,總共的頁面數量,還是取出其中的部分條目.
MYSQL數據庫(2)不顯示總共有多少條目.Google搜索結果的分頁顯示就用了這個特性.很多時候你可能看了前幾頁,就夠了.那么我可以這樣,每次我都把結果限制在500條(這個數據越大 資源消耗越大)然后你每次查詢的時候,都查詢501條記錄,這樣,如果結果真有501個,那么我們就顯示鏈接 “顯示下500條記錄”.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6176.html