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