程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql慢查詢日志過程

Mysql慢查詢日志過程

編輯:MySQL綜合教程


Mysql慢查詢日志過程   mysql慢查詢日志對於跟蹤有問題的查詢非常有用,可以分析出代碼實現中耗費資源的sql語句,對我們程序的優化有很高的參考。本篇主要將慢查詢日志的開啟,日志分析,這也是優化SQL程序的一般步驟中至關重要的一步。    www.2cto.com   1.mysql慢查詢日志            打開mysql的慢查詢日志很簡單,只需要在mysql的配置文件裡(windows系統是my.ini,linux系統是my.cnf)的[mysqld]下面加上  Java代碼   log-slow-queries=mysql_slow.log   long_query_time=3               其中log-slow-queries為日志的文件名,可以指定目錄,如log-slow-queries=D:\mysql_slow.log; long_query_time為定義多長的查詢我們定義為慢查詢,並記錄在log-slow-queries 指定的文件中,在這裡我們定義超過3秒的查詢進行記錄。            配置完成以後重啟Mysql服務器,執行show variables like '%slow%';查看慢查詢日志是否開啟,如果slow_query_log和log_slow_queries顯示為on,那說明服務器的慢查詢日志已             www.2cto.com             經開啟了。如下顯示:  Java代碼   mysql> show variables like '%slow%';   +---------------------+----------------+   | Variable_name       | Value          |   +---------------------+----------------+   | log_slow_queries    | ON             |   | slow_launch_time    | 2              |   | slow_query_log      | ON             |   | slow_query_log_file | mysql_slow.log |   +---------------------+----------------+   4 rows in set (0.00 sec)     slow_launch_time跟慢查詢日志沒有任何關系, 它代表的是thread create的一個阈值,如果要看 long_query_time,可以用  Java代碼   mysql> show variables like '%long%';   +-----------------+----------+   | Variable_name   | Value    |   +-----------------+----------+   | long_query_time | 3.000000 |   +-----------------+----------+   1 row in set (0.00 sec)     www.2cto.com     2.mysql慢查詢日志分析               建表如下圖,建表勿要給text加上索引,否則可能出現不了超過3秒的查詢,數據表填充了4194304條數據。                              我們來執行一個超過3秒的查詢,如下:  Java代碼        mysql> select * from wei where text='orange';   +---------+--------+   | id      | text   |   +---------+--------+   | 4103519 | orange |   +---------+--------+     1 row in set (3.79 sec)  再執行一個超過3秒的和一個沒有超過3秒的:  Java代碼   mysql> select * from wei where text='xishizhaohua';   Empty set (3.82 sec)     Java代碼   [mysql> select * from wei where id=4564;   +------+--------------------+   | id   | text               |   +------+--------------------+   | 4564 | yyyyyyyyyyyyyyyyyy |   +------+--------------------+   1 row in set (0.02 sec)     www.2cto.com   可以通過下面的命令查看現在這個session有多少個慢查詢:      現在我們可以查看mysql_slow.log(win7默認在C:\ProgramData\MySQL\MySQL Server 5.1\data下面),裡邊內容如下,內容比較明了,包括查詢花費的語句及時間,還包括查詢時的時間戳等信息,其中Rows_examined為檢查的行數,對我們優化也很有幫助  # 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';    3.優化    其實定位到了慢查詢語句就已經完成了一大不了,執行explain或者desc命令查看慢查詢語句,如下圖:                  問題很明顯,解決方式也很明顯,建索引了。  Java代碼   mysql> create index text_index on wei(text);   Query OK, 4194304 rows affected (1 min 58.07 sec)   Records: 4194304  Duplicates: 0  Warnings: 0     www.2cto.com   然後在執行查詢操作,用時明顯少了很多。  Java代碼   mysql> select * from wei where text='orange';   +---------+--------+   | id      | text   |   +---------+--------+   | 4103519 | orange |   +---------+--------+   1 row in set (0.33 sec)     Java代碼   mysql> select * from wei where text='xishizhaohua';   Empty set (0.01 sec)  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved