進行MySQL的配置優化,首先必須找出MySQL的性能瓶頸所在;而SHOW STATUS輸出的報告正是用來計算性能瓶頸的參考數據。mysqlreport不像SHOW STATUS那樣簡單的羅列數據,而是對這些參考數據加以融合計算,整理成一個個優化參考點,然後就可以根據這個優化參考點的值以及該點的衡量標準,進行對應調整。
一、安裝:
下載mysqlreport工具,直接解壓即可,下載地址: http://hackmysql.com/scripts/mysqlreport-3.5.tgz
需要注意的是,mysqlreport是基於perl語言開發,其運行依賴於perl-DBI和perl-DBD-MySQL,所以需要先安裝這兩個軟件。
二、使用:
mysqlreport常用指令:
--user # 指定連接數據庫的用戶
--password #指定連接數據庫的密碼
--port #指定端口
--host #指定主機
--sokcet #指定socket文件
--flush-status #顯示完報告後,執行"FLUSH STATUS"語句
--outfile #將報告輸出至某個文件中
三、輸出的報告詳細說明
1、基本信息
說明mysql當前的版本,運行的時間,以及當前系統時間
MySQL 5.1.61-log uptime 262 23:51:59 Wed Jul 16 17:58:05 2014 |
2、索引報表
說明mysql當前索引緩衝區的使用率,如果過高,則需要調整key_buffer_size的大小了。write hit及read hit分別說明了寫索引和讀索引的效率
__ Key _________________________________________________________________ Buffer used 8.67M of 512.00M %Used: 1.69 Current 51.75M %Usage: 10.11 Write hit 34.33% Read hit 99.17% |
3、請求報表
1)第一部分mysql處理的總請求數、平均每秒處理的請求數及請求類型。
QC Hists:是指mysql直接從查詢緩存中請求結果的數量,也就是查詢緩存的命中率,此值越高越好
DMS:是指數據操作語言,也就是增刪改查
Com_:是指mysql處理自身運行所使用的開銷
2)第二部分是說明mysql的慢查詢數,多長時間的查詢被認爲是慢查詢,是由long_query_time定義的。處理慢查詢的比例越低越好,一般不要超過0.05%。慢查詢日誌建議開啓。
3)第三部分詳細說明了DMS中各種語句的處理數及比例
4)第四部分則詳細說明了Com_中各事件的處理數及比例
|
5、查詢與排序
詳細說明mysql在查詢時的資源消耗
scan展示的是對全表進行掃描的select語句個數
full join則是多表聯合查詢的次數
__ SELECT and Sort _____________________________________________________ Scan 284.42M 12.5/s %SELECT: 53.05 Range 53.32M 2.3/s 9.95 Full join 3.40M 0.1/s 0.63 Range check 0 0/s 0.00 Full rng join 2.09k 0.0/s 0.00 Sort scan 242.41M 10.7/s Sort range 5.78M 0.3/s Sort mrg pass 0 0/s |
6、查詢緩存(只有在開啓了查詢緩存之後纔會出現)
詳細說明了查詢緩存的內存使用率
Block Fragmnt:是指內存塊碎片,如果你有一個返回超小結果的海量查詢,默認的塊大小(即4KB)可能會導致大量的內存碎片,這個時候,需要降低"query_cache_min_res_unit"的值,比值越大,碎片越多,一般不建議超過10%
Hits/Inserts/Prunes:其中Hits是最重要的,它反應了有多少查詢是從查詢緩存中直接獲得的,Prunes是指每秒刪除的碎片時,該值越低越好
insert/prune:是一個波動性的QC指標。一個穩定運行中的QC,insert進QC的查詢數量應該大於prune掉的查詢數量。而一個不穩定的QC,比值或許是1:1,甚至偏向prune。這說明兩個問題:1、QC大小不夠;2、mysql試圖緩存一切
hit/insert:用來反映QC的有效性。理想情況是:mysql插入一批穩定的查詢到QC裏,然後源源不斷的命中這批結果……所以,如果QC的有效性足夠,這個比值應該是偏向hit的。
__ Query Cache _________________________________________________________ Memory usage 68.37M of 128.00M %Used: 53.42 Block Fragmnt 18.92% Hits 2.93G 129.0/s Inserts 353.54M 15.6/s Insrt:Prune 4.17:1 11.8/s Hit:Insert 8.29:1 |
7、表鎖
一行是總數,一行是當前數。鎖等待對於數據庫來說永遠是糟糕的事情。第三列的總比值反應了一個綜述的情況,無論如何不能高過10%,否則肯定就帶來一大堆的索引和慢查詢問題!
__ Table Locks _________________________________________________________ Waited 949 0.0/s %Total: 0.00 Immediate 2.01G 88.4/s |
8、表
一行是當前mysql打開的表個數,以及表緩存的使用率,另一行是指mysql運行以來的平均值。這裏有兩個值比較重要,一個是表的緩存使用率真,如果達到100%,則需要調整"table_open_cahce"的大小;另一個是當前打開表的頻率,一般這個值應該小於每秒1次。不過一個負載比較高而又運行的還不錯的mysql,可能能達到每秒打開7次表,依然保持100%的表緩存
__ Tables ______________________________________________________________ Open 128 of 128 %Cache: 100.00 Opened 39.85M 1.8/s |
9、數據庫連接數
如果最大連接數接近100%,則需要調整"max_connetions"參數,當然如果連接數過大,有可能是慢查詢、糟糕的索引、dns解析太慢所導致的問題;每秒連接數,一般小於5個每秒,但通常只要mysql運行正常,就無所謂
__ Connections _________________________________________________________ Max used 547 of 886 %Max: 61.74 Total 97.48M 4.3/s |
7、臨時表
mysql可以在內存、磁盤及臨時文件上創建臨時表,要儘可能避免在磁盤上創建臨時表,因爲速度最慢,要儘可能在內存中創建,第三行的Table就媽表示在內存中創建臨時表的大小,Size是指定的內存允許創建的臨時表的大小,可以通過"tmp_table_size"參數來調整其大小
__ Created Temp ________________________________________________________ Disk table 186.19M 8.2/s Table 434.05M 19.1/s Size: 64.0M File 5 0.0/s |
8、線程
當mysql的連接數超過了線程緩存數時,需要增大"thread_cache_size"參數的大小
__ Threads _____________________________________________________________ Running 1 of 1 Cached 7 of 8 %Hit: 99.48 Created 509.01k 0.0/s Slow 0 0/s |
9、中斷及流量
__ Aborted _____________________________________________________________ Clients 2.36k 0.0/s Connects 111.05k 0.0/s __ Bytes _______________________________________________________________ Sent 2.56T 112.8k/s Received 892.91G 39.3k/s |
10、Innodb緩衝池
innodb緩衝池的大小可以通過"innodb_buffer_size"參數來調整,作爲一個innodb引擎的數據庫,請儘可能調大該值
__ InnoDB Buffer Pool __________________________________________________ Usage 1.00G of 1.00G %Used: 100.00 Read hit 100.00% Pages Free 3 %Total: 0.00 Data 62.67k 95.63 %Drty: 0.01 Misc 2861 4.37 Latched 0.00 Reads 4.27T 188.1k/s #innodb緩衝池讀性能 From file 4.35M 0.2/s 0.00 #從文件讀取 Ahead Rnd 243362 0.0/s #隨機讀 Ahead Sql 134409 0.0/s #順序讀,只有進行全表掃描的時候纔會出現 Writes 3.17G 139.4/s #緩衝池寫的數量 Flushes 17.36M 0.8/s #緩衝池的頁刷新請求數 Wait Free 0 0/s #空閒等待時間,越小越好 |
11、innodb鎖
__ InnoDB Lock _________________________________________________________ Waits 0 0/s #等待某行解鎖的累積次數,最好是0次 Current 0 #當前正在等待解鎖的行個數,最好是0次 Time acquiring Total 0 ms Average 0 ms Max 0 ms |
12、innodb數據、頁、行
第一部分列出了四種類型的數據操作,分別是讀、寫、刷新、等待
第二部分列出了innodb的頁信息,緩衝池中頁的創建、讀取、寫入的數量
第三部分則列出了一些對innodb行進行增刪改查的數據量
|