MySQL的優化點總結---通過計算多種狀態的百分比看MySQL的性能情況


 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 '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 緩存的效率,該比例越大越好


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM