一。常用命令
1.show variables查看系統變量
show variables 查看的是mysql系統變量,是MySQL系統運行時的參數,如字符集設置、版本信息、默認參數等,除非手動修改,否則運行時一般不會改變;
2.show status
是MySQL服務器運行統計,如打開的表數量、命令計數、qcache計數等。
是系統狀態 是動態
操作方式
1)**慢查詢**
通過 show variables like '%slow%';
log_show_queries看是否設置開啟慢查詢
slow_launch_time查看設置慢查詢的時間
show global status like '%slow%';查看慢查詢的條數
通過show global variables like 'slow_query_log_file';查看面查詢文件存放位置
2)**連接數**
show variables like 'max_connections';查看設置的最大連接數
show global status like 'Max_used_connections';查看服務器響應的最大連接數
Max_used_connections / max_connections * 100% ≈ 85%
最大連接數占上限連接數的85%左右,如果發現比例在10%以下,MySQL服務器連接數上限設置的過高了。
3)**Key_buffer_size 命中率**
key_buffer_size是對**MyISAM**表性能影響最大的一個參數,下面一臺以MyISAM為主要存儲引擎服務器的配置:
mysql> show variables like 'key_buffer_size';
value分配的內存
show global status like 'key_read%';
兩個參數
1. Key_read_requests 內存共有多少索引讀取請求
2. Key_reads 請求在內存中沒有找到直接從硬盤讀取索引
計算未命中緩存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
key_cache_miss_rate在0.1%以下都很好(每1000個請求有一個直接讀硬盤),如果key_cache_miss_rate在 0.01%以下的話,key_buffer_size分配的過多,可以適當減少。
MySQL服務器還提供了key_blocks_*參數:
show global status like 'key_blocks_u%';
兩個參數
1.Key_blocks_unused 表示未使用的緩存簇(blocks)數
2.Key_blocks_used 表示曾經用到的最大的blocks數
比較理想的設置:Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
4)**臨時表**
show global status like 'created_tmp%';
三個參數
1. Created_tmp_disk_tables 服務器執行語句時,自動創建臨時表數量
2. Created_tmp_files mysql已經創建臨時表數量
3. Created_tmp_tables 如果自動創建臨時表大小偏大,就自動基于內存?????
每次創建臨時表,Created_tmp_tables增加,如果是在磁盤上創建臨時表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務創建的臨時文件文件數,比較理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
MySQL服務器對臨時表的配置:
show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
max_heap_table_size
tmp_table_size
5)**Open Table情況**
show global status like 'open%tables%';
兩個參數
1. Open_tables 打開表的數量
2. Opened_tables 打開過的表數量
如果Opened_tables數量過大,說明配置中 table_cache(5.1.3之后這個值叫做table_open_cache)值可能太小,我們查詢一下服務器table_cache值:
mysql> show variables like 'table_cache';
比較合適的值為:
Open_tables / Opened_tables?? * 100% >= 85%
Open_tables / table_cache * 100% <= 95%
6)**線程使用情況**
show global status like 'Thread%';
四個參數
Threads_cached
Threads_connected
Threads_created
Threads_running
如果我們在MySQL服務器配置文件中設置了thread\_cache\_size,當客戶端斷開之后,服務器處理此客戶的線程將會緩存起來以響應下一個客戶 而不是銷毀(前提是緩存數未達上限)。Threads\_created表示創建過的線程數,如果發現Threads\_created值過大的話,表明 MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread\_cache\_size值,查詢服務器 thread\_cache\_size配置:
mysql> show variables like 'thread_cache_size';
7)**查詢緩存(query cache)**
show global status like 'qcache%';
變量
Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個空閑塊。
Qcache_free_memory:緩存中的空閑內存。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。
Qcache_lowmem_prunes: 緩存出現內存不足并且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者內存 很少。(上面的 free_blocks和free_memory可以告訴您屬于哪種情況)
Qcache_not_cached:不適合進行緩存的查詢的數量,通常是由于這些查詢不是 SELECT 語句或者用了now()之類的函數。
Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。
Qcache_total_blocks:緩存中塊的數量。
query_cache的配置:
query\_cache\_limit:超過此大小的查詢將不緩存
query\_cache\_min\_res\_unit:緩存塊的最小大小
query\_cache\_size:查詢緩存大小
query\_cache\_type:緩存類型,決定緩存什么樣的查詢,示例中表示不緩存 select sql\_no\_cache 查詢
query\_cache\_wlock\_invalidate:當有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表獲取結果。
query\_cache\_min\_res\_unit的配置是一柄”雙刃劍”,默認是4KB,設置值大對[大數據](http://lib.csdn.net/base/hadoop "Hadoop知識庫")查詢有好處,但如果你的查詢都是小數據查詢,就容易造成內存碎片和浪費。
查詢緩存碎片率 = Qcache\_free\_blocks / Qcache\_total\_blocks \* 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query\_cache\_min\_res\_unit,如果你的查詢都是小數據量的話。
查詢緩存利用率 = (query\_cache\_size - Qcache\_free\_memory) / query\_cache\_size \* 100%
查詢緩存利用率在25%以下的話說明query\_cache\_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且Qcache\_lowmem\_prunes > 50的話說明query\_cache\_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache\_hits - Qcache\_inserts) / Qcache\_hits \* 100%
示例服務器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
8)**排序使用情況**
show global status like 'sort%';
+-------------------+------------+
| Variable\_name???? | Value??? |
+-------------------+------------+
| Sort\_merge\_passes | 29?????? |
| Sort\_range??????? | 37432840 |
| Sort\_rows?????? | 9178691532 |
| Sort\_scan?????? | 1860569 |
+-------------------+------------+
Sort\_merge\_passes 包括兩步。MySQL 首先會嘗試在內存中做排序,使用的內存大小由系統變量Sort\_buffer\_size 決定,如果它的大小不夠把所有的記錄都讀到內存中,MySQL 就會把每次在內存中排序的結果存到臨時文件中,等MySQL 找到所有記錄之后,再把臨時文件中的記錄做一次排序。這再次排序就會增加 Sort\_merge\_passes。實際上,MySQL會用另一個臨時文件來存再次排序的結果,所以通常會看到 Sort\_merge\_passes增加的數值是建臨時文件數的兩倍。因為用到了臨時文件,所以速度可能會比較慢,增加 Sort\_buffer\_size 會減少Sort\_merge\_passes 和 創建臨時文件的次數,但盲目的增加Sort\_buffer\_size 并不一定能提高速度
9)**文件打開數(open\_files)**
mysql> show global status like 'open\_files';
+---------------+-------+
| Variable\_name | Value |
+---------------+-------+
| Open\_files | 1410?? |
+---------------+-------+
mysql> show variables like 'open\_files\_limit';
+------------------+-------+
| Variable\_name | Value |
+------------------+-------+
| open\_files\_limit | 4590?? |
+------------------+-------+
比較合適的設置:Open\_files / open\_files\_limit \* 100% <= 75%
10)**表鎖情況**
mysql> show global status like 'table\_locks%';
+-----------------------+-----------+
| Variable\_name?????? | Value???? |
+-----------------------+-----------+
| Table\_locks\_immediate | 490206328 |
| Table\_locks\_waited | 2084912 |
+-----------------------+-----------+
Table\_locks\_immediate 表示立即釋放表鎖數,Table\_locks\_waited表示需要等待的表鎖數,如果Table\_locks\_immediate / Table\_locks\_waited >5000,最好采用InnoDB引擎,因為InnoDB是行鎖而MyISAM是表鎖,對于高并發寫入的應用InnoDB效果會好些。示例中的服務 器Table\_locks\_immediate / Table\_locks\_waited = 235,MyISAM就足夠了。
11)**表掃描情況**
mysql> show global status like 'handler\_read%';
+-----------------------+-------------+
| Variable\_name?????? | Value??? |
+-----------------------+-------------+
| Handler\_read\_first | 5803750???? |
| Handler\_read\_key??? | 6049319850?? |
| Handler\_read\_next???? | 94440908210 |
| Handler\_read\_prev???? | 34822001724 |
| Handler\_read\_rnd??? | 405482605 |
| Handler\_read\_rnd\_next | 18912877839 |
+-----------------------+-------------+
mysql> show global status like 'com\_select';
+---------------+-----------+
| Variable\_name | Value???? |
+---------------+-----------+
| Com\_select | 222693559 |
+---------------+-----------+
計算表掃描率:
表掃描率 = Handler\_read\_rnd\_next / Com\_select
如果表掃描率超過4000,說明進行了太多表掃描,很有可能索引沒有建好,增加read\_buffer\_size值會有一些好處,但最好不要超過8MB。
12)QPS(每秒查詢量)
~~~
show global status like 'Questions'//查詢的數量
show global status like 'Uptime'//查詢當前MySQL本次啟動后的運行統計時間
將這兩個相除得到每秒查詢量
~~~
13) TPS(每秒事務量)
TPS = (Com_commit + Com_rollback) / seconds
mysql > show global status like'Com_commit';
mysql > show global status like'Com_rollback';
14)Innodb緩存命中率
show status like 'Innodb_buffer_pool_%';
?? 其中,Innodb_buffer_pool_read_requests表示read請求的次數,Innodb_buffer_pool_reads表示從物理磁盤中讀取數據的請求次數,所以innodb buffer的read命中率就可以這樣得到:
(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%。
一般來講這個命中率不會低于99%,如果低于這個值的話就要考慮加大innodb buffer pool。
??????? 另外,Innodb_buffer_pool_pages_total參數表示緩存頁面的總數量(一頁16k,所以總共8M),Innodb_buffer_pool_pages_data代表有數據的緩存頁數,Innodb_buffer_pool_pages_free代表沒有使用的緩存頁數。如果Innodb_buffer_pool_pages_free偏大的話,證明有很多緩存沒有被利用到,這時可以考慮減小緩存,相反Innodb_buffer_pool_pages_data過大就考慮增大緩存。
?? 默認是8M,一般來講這個值肯定是不夠的,大家通常建議設置為系統內存的50%-80%,但也不是越大越好,要根據具體項目具體分析(操作系統留1G左右,mysql連接數*4M,宿主程序緩存nM)。設置方法,修改/etc/my.cnf文件,并添加字段innodb_buffer_pool_size = 3G,然后重啟mysql 服務就ok了。