天天看點

MySQL慢查詢日志

1.錯誤日志:記錄啟動、運作或停止mysqld時出現的問題。

2.通用查詢日志:記錄建立的用戶端連接配接和執行的語句。

3.更新日志:記錄更改資料的語句。該日志在MySQL 5.1中已不再使用。

4.二進制日志:記錄所有更改資料的語句。還用于主從複制。

5.慢查詢日志:記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。

6.Innodb日志:innodb redo log

7.中繼日志:從庫從主庫擷取到的要更新的資料的日志。

預設情況下,所有日志建立于mysqld資料目錄中。 可以通過重新整理日志,來強制mysqld來關閉和重新打開日志檔案(或者在某些情況下切換到一個新的日志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,則日志被老化。對于存在MySQL複制的情形下,從複制伺服器将維護更多日志檔案,被稱為接替日志。

<br>

在學習通用日志查詢時,需要知道幾個資料庫中的常用指令:

1.show variables like '%version%';

這個指令,可以顯示目前資料庫中與版本号相關的資訊。示例:

以下這個指令是用于檢視目前的通用日志查詢是否開啟,如果general_log的值為ON則為開啟,為OFF則為關閉(預設情況下是關閉的)。

2.show variables like '%general%';

示例:

以下這個指令是用于檢視目前通用查詢日志輸出的格式,log_output的值可以是FILE(存儲在數資料庫的資料檔案中的hostname.log),也可以是TABLE(存儲在資料庫中的mysql.general_log)。

3.show variables like '%log_output%';

開啟通用日志查詢: set global general_log=on;

關閉通用日志查詢: set global general_log=off;

設定将通用日志記錄到資料庫表格中: set globallog_output='TABLE';

設定将通用日志記錄到本地檔案中: set globallog_output='FILE';

設定将通用日志記錄到資料庫表和本地檔案中:set global log_output='FILE,TABLE';

記錄到mysql.general_log表中的資料如下:

MySQL慢查詢日志

預設情況下記錄在本地檔案中的通用查詢日志檔案名稱的字首為主機名,字尾為.log,可以使用find指令尋找,示例:

注意:上述指令隻是臨時生效,當MySQL重新開機後則會失效,如果要永久生效,需要配置my.cnf檔案

my.cnf檔案需要配置的内容如下:

如果沒有開啟通用日志查詢的話,general_log表是空的:

  MySQL的慢查詢日志是MySQL提供的一種日志記錄,用來記錄在MySQL中響應時間超過門檻值的語句,具體指運作時間超過long_query_time值的SQL語句,就會被記錄到慢查詢日志中(日志可以寫入檔案或者資料庫表,如果對性能要求高的話,建議寫檔案)。是以慢查詢日志就是記錄mysql伺服器中影響資料庫性能的相關SQL語句的,通過對這些特殊的SQL語句分析,改進以達到提高資料庫性能的目的。預設情況下,MySQL資料庫是不開啟慢查詢日志的,long_query_time的預設值為10(即10秒,通常設定為1秒),即運作10秒以上的語句是慢查詢語句。

一般情況下,慢查詢發生在資料庫比較大的表格中(比如:一個表的資料量有幾百萬),且查詢條件的字段沒有建立索引,此時,要比對查詢條件的字段會進行全表掃描,查詢耗時超過long_query_time所定義的門檻值(預設值),則為慢查詢語句,這些慢查詢語句就會記錄到慢查詢日志中。

使用以下指令可以檢視目前慢查詢日志的開啟情況:

show variables like '%quer%';

需要關注以下的幾個參數:

1.slow_query_log: 的值為ON為開啟慢查詢日志,OFF則為關閉慢查詢日志。

  2.slow_query_log_file: 的值是記錄的慢查詢日志到檔案中(注意:預設名為主機名.log,慢查詢日志是否寫入指定檔案中,需要指定慢查詢的輸出日志格式為檔案,相關指令為:show variables like ‘%log_output%’;去檢視輸出的格式)。

  3.long_query_time: 指定了慢查詢的門檻值,即如果執行語句的時間超過該門檻值則為慢查詢語句,預設值為10秒。

  4.log_queries_not_using_indexes: 如果值設定為ON,則會記錄所有沒有利用索引的查詢(注意:如果隻是将log_queries_not_using_indexes設定為ON,而将slow_query_log設定為OFF,此時該設定也不會生效,即該設定生效的前提是slow_query_log的值設定為ON),一般在性能調優的時候會暫時開啟。

  5.min_examined_row_limit: 查詢檢查傳回少于該參數指定行的SQL不被記錄到慢查詢日志

  6.log_slow_queries: 指定是否開啟慢查詢日志(該參數要被slow_query_log取代,做相容性保留)

和通用查詢日志一樣,慢查詢日志也是使用 show variables like '%log_output%'; 語句來檢視日志的記錄方式:

設定記錄日志的方式也是和之前的一樣:

開啟慢查詢日志:

如果出現修改之後依舊顯示為預設值的情況,重新登入mysql就好了,或者在show後面加上global關鍵字也可以。

關于慢查詢日志的表中的資料個文本中的資料格式分析:

慢查詢的日志記錄myql.slow_log表中,格式如下:

MySQL慢查詢日志

查詢語句:

select * from mysql.slow_log;

此時再檢視一下慢查詢的記錄數量:

慢查詢日志和通用查詢日志都是使用的同一個本地檔案:

可以看到,不管是表還是檔案,都具體記錄了:是哪條sql語句導緻慢查詢(sql_text),該慢查詢語句的查詢時間(query_time),鎖表時間(Lock_time),以及掃描過的行數(rows_examined)等資訊。

實際在學習過程中,如何得知設定的慢查詢是有效的?很簡單,我們可以手動産生一條慢查詢語句,比如,如果我們的慢查詢log_query_time的值設定為1,則執行以下這條語句就可以了:

selectsleep(1);

該條語句即是慢查詢語句,之後,便可以在相應的日志輸出檔案或表中去檢視是否有該條語句。

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/2049236,如需轉載請自行聯系原作者