您好,登錄后才能下訂單哦!
第一步.開啟mysql慢查詢
方式一:修改配置文件
Windows:Windows 的配置文件為 my.ini,一般在 MySQL 的安裝目錄下或者 c:\Windows 下。
Linux:Linux 的配置文件為 my.cnf ,一般在 /etc 下
在 my.ini 增加幾行:
[mysqlld] long_query_time=2 #5.0、5.1等版本配置如下選項 log-slow-queries="mysql_slow_query.log" #5.5及以上版本配置如下選項 slow-query-log=On slow_query_log_file="mysql_slow_query.log" log-query-not-using-indexes
第一句使用來定義查過多少秒的查詢算是慢查詢,我這里定義的是2秒
第二句使用來定義慢查詢日志的路徑(因為是windows,所以不牽涉權限問題)
第三句就是記錄下沒有使用索引的query
第二步:查看關于慢查詢的狀態
方式二:通過MySQL數據庫開啟慢查詢
上文的配置需要重啟mysql server進程mysqld才會生效。但是很多時候,尤其是產品運營環境,不希望每次修改都需要重新啟動mysql服務器,也希望能在某些特定時間記 錄。MySQL5.1給我們提供了更為靈活的運行時控制,使得你不必重新啟動mysql服務器,也能選擇性地記錄或者不記錄某些slow queries。
MySQL5.1中,提供了全局變量slow_query_log
、slow_query_log_file
可以靈活地控制enable/disable慢查詢。同時可以通過long_query_time
設置時間
#//啟用slow query記錄 #注意:設置了slow_query_log全局變量, log_slow_queries也會隱性地跟著改變 mysql>set global slow_query_log=ON
不幸運的是,在MySQL5.0并沒有提供類似的全局變量來靈活控制,但是我們可以通過將long_query_time設置得足夠大來避免記錄某些查詢語句。比如
mysql>set global long_query_time = 3600; mysql>set global log_querise_not_using_indexes = ON;
MySQL5.0, 不關服務的情況下,希望不記錄日志的辦法是將日志文件成為/dev/null的符號鏈接(symbolic link)。注意:你只需要在改變后運行FLUSH LOGS以確定MYSQL釋放當前的日志文件描述符,重新把日志記錄到/dev/null
和MySQL5.0不同,MySQL5.1可以在運行時改變日記行為,將日志記錄到數據庫表中。只要將mysql全局變量log_output設置為 TABLE即可。MySQL會將日志分別記錄到表mysql.gengera_log和mysql.slow_log二張表中。但是,我們推薦將日志記錄 在日記文件中。
mysql> show variables like ‘log_output'\G Variable_name: log_output Value: FILE mysql>set global log_output='table';
缺陷與審記
雖然記錄了slow query能夠幫助你優化產品。但是MySQL目前版本,還有幾大蹩足的地方。
通過microslow-patch補丁可使用更細的時間粒度,和記錄所有執行過的sql語句。不過,使用這個補訂不得不自己編譯MySQL,出于穩定性考濾,我們推薦在開發測試環境,可以打上這個補丁,享受這個補丁帶來的便利。在運營環境盡量不要這么做…
第二步.驗證慢查詢是否開啟
執行如下SQL語句來查看mysql慢查詢的狀態
執行結果會把是否開啟慢查詢、慢查詢的秒數、慢查詢日志等信息打印在屏幕上。
/*查看慢查詢時間 */ show variables like "long_query_time";默認10s /*查看慢查詢配置情況 */ show status like "%slow_queries%"; /*查看慢查詢日志路徑 */ show variables like "%slow%";
第三步:執行一次慢查詢操作
其實想要執行一次有實際意義的慢查詢比較困難,因為在自己測試的時候,就算查詢有20萬條數據的海量表,也只需要0.幾秒。我們可以通過如下語句代替:
SELECT SLEEP(10);
第四步:查看慢查詢的數量
通過如下sql語句,來查看一共執行過幾次慢查詢:
show global status like '%slow%';
mysql日志的配置:
注意:這些日文件在mysql重啟的時候才會生成 #記錄所有sql語句 log=E:/mysqllog/mysql.log #記錄數據庫啟動關閉信息,以及運行過程中產生的錯誤信息 log-error=E:/mysqllog/myerror.log # 記錄除select語句之外的所有sql語句到日志中,可以用來恢復數據文件 log-bin=E:/mysqllog/bin #記錄查詢慢的sql語句 log-slow-queries=E:/mysqllog/slow.log #慢查詢時間 long_query_time=2
第四步:分析慢查詢日志
方式一:通過工具分析
MySQL自帶了mysqldumpslow工具用來分析slow query日志,除此之外,還有一些好用的開源工具。比如MyProfi(下載地址:http://sourceforge.net/projects/myprofi/)、mysql-log-filter,當然還有mysqlsla
以下是mysqldumpslow常用參數說明,詳細的可應用mysqldumpslow -help查詢。
接下來就是用mysql自帶的慢查詢工具mysqldumpslow分析了(mysql的bin目錄下),我這里的日志文件名字是host-slow.log。
列出記錄次數最多的10個sql語句
mysqldumpslow -s c -t 10 host-slow.log
列出返回記錄集最多的10個sql語句
mysqldumpslow -s r -t 10 host-slow.log
按照時間返回前10條里面含有左連接的sql語句
mysqldumpslow -s t -t 10 -g "left join" host-slow.log
使用mysqldumpslow命令可以非常明確的得到各種我們需要的查詢語句,對MySQL查詢語句的監控、分析、優化起到非常大的幫助。
方式二:直接分析mysql慢查詢日志
日志部分內容如下:
# Time: 121017 17:38:54 # User@Host: root[root] @ localhost [127.0.0.1] # Query_time: 3.794217 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4194304 SET timestamp=1350466734; select * from wei where text='orange'; # Time: 121017 17:46:22 # User@Host: root[root] @ localhost [127.0.0.1] # Query_time: 3.819219 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 4194304 SET timestamp=1350467182; select * from wei where text='xishizhaohua';
其實定位到了慢查詢語句就已經完成了一大不了,執行explain或者desc命令查看慢查詢語句,如下圖:
問題很明顯,解決方式也很明顯,建索引了。
mysql> create index text_index on wei(text); Query OK, 4194304 rows affected (1 min 58.07 sec) Records: 4194304 Duplicates: 0 Warnings: 0
然后在執行查詢操作,用時明顯少了很多。
mysql> select * from wei where text='orange'; +---------+--------+ | id | text | +---------+--------+ | 4103519 | orange | +---------+--------+ 1 row in set (0.33 sec)
Slow Query日志,雖然幫助你記錄了那些執行過了的SQL語句。但它不是萬能的,意義可能沒有你想象的那么大。它只告訴了你哪些語句慢,但是為什么慢?具體 原因,還是需要你自己去分析,不斷的調試。也許,你只需要換一條更有效的sql語句,也許你只需簡單地增加一個索引,但也有可能你需要調整你應用程序的設 計方案。比如,上面那條語句是很明顯,它檢查了600多萬行數據。不幸的是,并不是每條語句都這么明顯。也許還有別的原因,比如:
所以,不要過于緊張日志文件某條記錄,而應該理性地審記,找出真正的原因。如果經常出現的slow query需要特別注意。如果個別出現,則做一些常規檢查即可。我們建議,統計并且形成基準報告,進行比較排除,比胡亂瞎撞有用。希望大家不要在這部分過于浪費時間與精力。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。