對Mysql進(jìn)行深入的分析對于發(fā)現(xiàn)mysql性能瓶頸和尋找優(yōu)化策略是十分必要的。 我們可以從不同的粒度上對Mysql進(jìn)行分析:可以整體分析服務(wù)器,或者檢查單個查詢或批查詢。
通過分析,我們得到的如下信息:
1、Mysql訪問得最多的數(shù)據(jù)
2、Mysql執(zhí)行得最多的查詢的種類
3、Mysql停留時間最長的狀態(tài)
4、Mysql用來執(zhí)行查詢的使用得最頻繁的子系統(tǒng)
5、Mysql查詢過程中訪問的數(shù)據(jù)種類
6、Mysql執(zhí)行了多少種不同類型的活動,比如索引掃描。
Mysql提供了兩種查詢?nèi)罩荆鼈兛梢詾槲覀儷@取以上信息提供幫助。 這兩種查詢?nèi)罩緸?strong>普通日志(general log)和慢速日志(slow log)。
General log:
Geleral log記錄了服務(wù)器接收到的每一個查詢或是命令,無論這些查詢或是命令是否正確甚至是否包含語法錯誤,general log 都會將其記錄下來 ,記錄的格式為 {Time ,Id ,Command,Argument }。也正因?yàn)閙ysql服務(wù)器需要不斷地記錄日志,開啟General log會產(chǎn)生不小的系統(tǒng)開銷。 因此,Mysql默認(rèn)是把General log關(guān)閉的。 我們可以通過修改Mysql全局變量來開啟General log功能或是更改日志存放路徑。
注意:mysql5.0版本,如果要開啟slow log、general log,需要重啟,從MySQL5.1.6版開始,general query log和slow query log開始支持寫到文件或者數(shù)據(jù)庫表兩種方式,并且日志的開啟,輸出方式的修改,都可以在Global級別動態(tài)修改。
1、首先查看log_output,確認(rèn)日志輸出到文件還是數(shù)據(jù)庫。
mysql> show variables like 'log_output';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| log_output | FILE |
+-------------------+-------+
1 row in set (0.00 sec)
通過以上結(jié)果可以發(fā)現(xiàn),log_output的值為FILE,證明是輸出到日志文件,如果為TABLE則輸出到默認(rèn)‘mysql’數(shù)據(jù)庫中的相應(yīng)日志表,該表的默認(rèn)引擎為CSV。
2、接下來通過如下命令可以查看 mysql默認(rèn)的 General log 配置。
mysql> show global variables like '%general%';
+------------------+---------------------------+
| Variable_name | Value |
+------------------+---------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/ubuntu.log |
+------------------+---------------------------+
2 rows in set (0.00 sec)
general_log的值為OFF,所以當(dāng)前general_log是關(guān)閉的。general_log_file變量的值是日志文件的路徑。
3、通過 set global general_log = on; 命令開啟General log。
4、最后我們可以從/var/lib/mysql/ubuntu.log文件中查看相應(yīng)日志信息。
Slow log:
General log日志內(nèi)容比較簡單,不包含執(zhí)行時間或其他只有在查詢結(jié)束之后才能得到的信息,相反,slow log 記錄了這些內(nèi)容。
1、我們首先來看一下與慢日志相關(guān)的全局變量。
mysql> show global variables like '%slow%';
+---------------------+--------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------+
| log_slow_queries | ON |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/ubuntu-slow.log |
+---------------------+--------------------------------+
4 rows in set (0.00 sec)
筆者的mysql已經(jīng)開啟了慢日志選項(xiàng)。變量slow_launch_time的值代表著捕獲所有執(zhí)行時間超過2秒的查詢。slow log可以記錄沒有使用索引的查詢,它也能記錄執(zhí)行速度比較慢的管理命令。
開啟log_queries_not_using_indexes,將會記錄沒有使用索引的查詢到slow日志里。
mysql> show global variables like '%not_using%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.00 sec)
slow log 的日志格式為:
# Time: 111108 19:38:00
# User@Host: root[root] @ localhost []
# Query_time: 15.268541 Lock_time: 0.000237 Rows_sent: 1 Rows_examined: 102
use mytest;
SET timestamp=1320752280;
select count(a.b) from mytable a ,mytable b ,mytable c ,mytable d;
慢速日志的確提供了很多有用的信息,但是不代表出現(xiàn)的查詢一定一直都是慢的。如果同樣的查詢在慢速日志里出現(xiàn)了多次,那么它的確需要優(yōu)化,但是如果只是出現(xiàn)了偶爾一兩次,則有可能是其他客觀原因造成的,比如某些鎖,I/O磁盤物理性問題,網(wǎng)絡(luò)問題等等。
慢速日志的slow_launch_time的時間單位為秒,可以通過網(wǎng)上第三方補(bǔ)丁將其更改為毫秒級,用于更加精細(xì)的日志記錄和分析,但是這需要重新編譯mysql。
我們通常在日志中查找下面幾個信息:長查詢、影響比較大的查詢和新查詢。這可能需要我們自己寫一下腳本或是借助某些第三方工具進(jìn)行日志分析。
General log 系統(tǒng)開銷比較大,一般不建議開啟。