1 讀寫比例:
show global status like 'com_select'; 獲得服務器啟動到目前查詢操作執行的次數;
show global status like 'com_insert'; 獲得服務器啟動到目前插入操作執行的次數;
show global status like 'com_update'; 獲得服務器啟動到目前更新操作執行的次數;
show global status like 'com_delete’; 獲得服務器啟動到目前刪除操作執行的次數;
計算讀百分比:
select concat(com_select / (com_select+com_insert+com_update+com_delete)* 100,'%');
計算寫百分比:
select concat(com_insert+com_update+com_delete / (com_select+com_insert+com_update+com_delete) * 100,’%’);
通過檢查數據庫讀寫比例,可反映出應用是讀密集型還是寫密集型。
2 慢查詢比例:
開啟慢查詢日志:
slow_query_log = 1 # 開啟慢查詢日志
log_output = FILE|TABLE # 指定日志存儲方式,默認為 file
slow_query_log_file = slow-query.log # 指定慢查詢日志文件位置
long_query_time = 1 # 執行及響應時間超過該參數設置的值記錄日志
show global status like 'com_insert'; 獲得服務器啟動到目前插入操作執行的次數;
show global status like 'com_update'; 獲得服務器啟動到目前更新操作執行的次數;
show global status like 'com_delete’; 獲得服務器啟動到目前刪除操作執行的次數;
計算讀百分比:
select concat(com_select / (com_select+com_insert+com_update+com_delete)* 100,'%');
計算寫百分比:
select concat(com_insert+com_update+com_delete / (com_select+com_insert+com_update+com_delete) * 100,’%’);
通過檢查數據庫讀寫比例,可反映出應用是讀密集型還是寫密集型。
2 慢查詢比例:
開啟慢查詢日志:
slow_query_log = 1 # 開啟慢查詢日志
log_output = FILE|TABLE # 指定日志存儲方式,默認為 file
slow_query_log_file = slow-query.log # 指定慢查詢日志文件位置
long_query_time = 1 # 執行及響應時間超過該參數設置的值記錄日志
show global status like 'Slow_queries '; # 獲得服務器啟動到目前慢查詢操作記錄的次數;
注意,慢查詢包括 select 、 update 以及 delete ,沒有 insert 。
計算慢查詢比例:
select concat(Slow_queries / (Com_select+Com_update+Com_delete) * 100,’%’);
通過計算慢查詢比例,可反映出數據庫運行效能。
3 連接數檢查:
show global status like 'max_connections'; # 獲得數據庫運行的最大連接數 //允許的最大連接數
show global status like 'Max_used_connections'; # 獲得最大一次的連接數 //最大突發並行連接數
show global status like 'connections'; # 獲得數據庫運行到目前,總共被連接了多少次 //登陸的次數
show global status like 'Threads_connected'; # 獲得當前連接數
show global status like 'Threads_running'; # 獲得當前正在運行的連接數
mysql> show global status like 'Threads_connected'; //兩次 mysql -uroot -p +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 2 | +-------------------+-------+ 1 row in set (0.01 sec) mysql> show global status like 'Threads_running'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 1 | +-----------------+-------+ 1 row in set (0.00 sec)
mysql> show processlist; +----+------+-----------+-------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+-------+---------+------+-------+------------------+ | 2 | root | localhost | mysql | Sleep | 4 | | NULL | | 3 | root | localhost | test | Query | 0 | init | show processlist | +----+------+-----------+-------+---------+------+-------+------------------+ 2 rows in set (0.00 sec)
計算當前連接數的比例:
select concat(Threads_connected / max_connections *100,'%'); # 計算最大一次的連接數比例:
select concat(Max_used_connections / max_connections *100,'%');# 通過連接數檢查,可得知數據庫在不同時間段被請求的壓力
4 線程緩存:
show global status like 'Connections'; # 獲得數據庫運行到目前,總共被連接了多少次
show global status like 'Threads_created'; # 獲得數據庫運行到目前,創建連接線程的次數
計算連接線程緩存命中率:
select concat((Connections-Threads_created) / Connections × 100,’%’);
通過計算連接線程緩存命中率,可反映出連接線程的命中情況,命中率越大越好。
如果命中率過低,則表示緩存連接線程的數量過少,可以考慮加大 thread_cache_size 的值。
5 表緩存:
show global status like 'Table_open_cache_misses'; # 新打開的表的次數。 不命中
show global status like 'Table_open_cache_hits'; # 從表緩存中拿已打開的表的次數,該狀態變量 5.6 才開始存在 命中
show global status like 'Opened_tables'; # 打開表的總次數
通過已知自己數據庫中有多少表,再觀察 Opened_tables 的值,可以得知表緩存的數量是否合理,如果打開表的次數大於數據庫中已有的表數
量,則表示 table_open_cache 的值不夠,可以考慮加大。
計算表緩存的命中率:
select concat(Table_open_cache_hits /(Table_open_cache_misses + Table_open_cache_hits) * 100,’%’);
通過計算表緩存的命中率,可反映出表緩存的情況,該比例越大越好
mysql> create table ttt (a int); Query OK, 0 rows affected (0.22 sec) mysql> show global status like 'Table_open_cache_hits'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_open_cache_hits | 31 | +-----------------------+-------+ 1 row in set (0.00 sec) mysql> show global status like 'Table_open_cache_misses'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Table_open_cache_misses | 116 | +-------------------------+-------+ 1 row in set (0.00 sec) mysql> show global status like 'Opened_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Opened_tables | 116 | +---------------+-------+ 1 row in set (0.00 sec) mysql> select * from ttt; //第一次打開 Empty set (0.01 sec) mysql> show global status like 'Opened_tables'; //+1 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Opened_tables | 117 | +---------------+-------+ 1 row in set (0.02 sec) mysql> show global status like 'Table_open_cache_misses'; //table緩存中沒有表,丟失 +1 +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Table_open_cache_misses | 117 | +-------------------------+-------+ 1 row in set (0.01 sec) mysql> show global status like 'Table_open_cache_hits'; //緩存未命中,不變 +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_open_cache_hits | 31 | +-----------------------+-------+ 1 row in set (0.01 sec) mysql> select * from ttt; //在打開表 Empty set (0.00 sec) mysql> show global status like 'Table_open_cache_hits'; //表緩存命中 +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_open_cache_hits | 32 | +-----------------------+-------+ 1 row in set (0.01 sec)
6 臨時表:
show global status like 'Created_tmp_disk_tables'; # 查看在磁盤上創建臨時表的次數
show global status like 'Created_tmp_tables'; # 查看創建臨時表的總次數,包括在內存中和磁盤。
如果發現在磁盤上創建臨時表的次數過多,則表示臨時表的緩存區內存不夠,可以考慮加大 tmp_table_size 和 max_heap_table_size 的值。
計算在磁盤上創建臨時表的比例:
select concat(Created_tmp_disk_tables / Created_tmp_tables * 100,’%’);
通過計算在磁盤上創建臨時表的比例,可反映出數據庫的使用臨時表的情況,該比例越小越好。
7 額外的排序:
show global status like 'Sort_merge_passes'; # 在磁盤中進行額外排序的次數
show global status like 'Sort_scan'; # 通過表掃描進行排序的總次數,也就是額外排序的總次數
如果發現在磁盤上進行排序的次數過多,則表示排序緩沖區內存不夠,可以考慮加大 sort_buffer_size 的值。
計算磁盤排序的比例:
select concat(Sort_merge_passes / Sort_scan * 100,'%');
通過計算在磁盤上進行額外排序的比例,可反映出數據庫排序的情況,該比例越小越好。
8 binlog 緩沖:
show global status like 'Binlog_cache_disk_use'; # 在磁盤上創建臨時文件用於保存 binlog 的次數
show global status like 'Binlog_cache_use'; # 緩沖 binlog 的總次數,包括 binlog 緩沖區和在磁盤上創建臨時文件保存 binlog 的總次數
如果發現在磁盤上創建臨時文件保存 binlog 的次數過多,則表示 binlog 緩沖區內存不夠,可以考慮加大 binlog_cache_size 的值。
計算在磁盤上創建臨時文件保存 binlog 的比例:
select concat(Binlog_cache_disk_use / Binlog_cache_use * 100,’%’);
通過計算在磁盤上創建臨時文件保 binlog 的比例,可反映出數據庫 binlog 的情況,該比例越小越好。
9 redo 日志:
select global status like 'Innodb_log_waits'; # 查看 innodb redo 日志等待緩沖區刷新的次數。
當 redo 緩沖區容納不下事務產生的 redo 日志時,本次事務產生的 redo 日志在寫入 redo 緩沖區之前就必須等待 redo 緩沖區有足夠的空間才能寫入。
如果發現 redo 日志等待刷新的次數過多,則表示 innodb redo 日志緩沖區的大小不夠,可以考慮加大 innodb_log_buffer_size 的值。
10 InnoDB 緩存:
show global status like 'Innodb_buffer_pool_read_requests'; # 讀取頁的總次數
show global status like 'Innodb_buffer_pool_read'; # 從磁盤讀取頁的次數
如果發現從磁盤讀取頁的次數過多,則有可能是因為 innodb 緩沖池的大小不夠,此時可以考慮加到 innodb_buffer_pool_size 的值。
計算 innodb 緩存命中率:
select concat((Innodb_buffer_pool_read_requests - Innodb_buffer_pool_read) / Innodb_buffer_pool_read_requests * 100,’%’);
通過計算 innodb 緩存命中率,可反映出 innodb 緩存的效率,該比例越大越好