MySQL常用的性能指標
(1) QPS(每秒Query量)
QPS = Questions(or Queries) / seconds
mysql > show global status like 'Question%';
(2) TPS(每秒事務量)
TPS = (Com_commit + Com_rollback) / seconds
mysql > show global status like'Com_commit';
mysql > show global status like'Com_rollback';
(3)key Buffer 命中率
mysql>show global status like 'key%';
key_buffer_read_hits = (1-key_reads /key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes /key_write_requests) * 100%
(4)InnoDB Buffer命中率
mysql> show status like'innodb_buffer_pool_read%';
innodb_buffer_read_hits = (1 -innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%
(5)Query Cache命中率
mysql> show status like 'Qcache%';
Query_cache_hits = (Qcahce_hits /(Qcache_hits + Qcache_inserts )) * 100%;
(6)Table Cache狀態量
mysql> show global status like 'open%';
比較 open_tables 與opend_tables 值
(7)Thread Cache 命中率
mysql> show global status like'Thread%';
mysql> show global status like'Connections';
Thread_cache_hits = (1 - Threads_created /connections ) * 100%
(8)鎖定狀態
mysql> show global status like '%lock%';
Table_locks_waited/Table_locks_immediate=0.3% 如果這個比值比較大的話,說明表鎖造成的阻塞比較嚴重
Innodb_row_lock_waits innodb行鎖,太大可能是間隙鎖造成的
(9)復制延時量
mysql > show slave status
查看延時時間
(10) Tmp Table 狀況(臨時表狀況)
mysql > show status like 'Create_tmp%';
Created_tmp_disk_tables/Created_tmp_tables比值最好不要超過10%,如果Created_tmp_tables值比較大,
可能是排序句子過多或者是連接句子不夠優化
(11) Binlog Cache 使用狀況
mysql > show status like'Binlog_cache%';
如果Binlog_cache_disk_use值不為0 ,可能需要調大 binlog_cache_size大小
(12) Innodb_log_waits 量
mysql > show status like'innodb_log_waits';
Innodb_log_waits值不等于0的話,表明 innodblog buffer 因為空間不足而等待
(13)open file and table
mysql> mysql -e "show global statuslike 'Open_files';
mysql> mysql -e "show global statuslike 'Open_tables';
(14) 慢查詢
開啟慢查詢:
編輯/etc/my.cnf,在[mysqld]域中添加:
slow_query_log= 1 # 開啟慢查詢
slow_query_log_file=/data/mysql/slow.log # 慢查詢日志路徑
long_query_time= 1 # 慢查詢的時長
查看慢查詢數量:
執行mysqladminstatus
(15)全日志
查看全日志:
show global variables like 'general_log';
開啟全日志:
set global general_log=on;
注意開啟全日志會消耗服務器性能,一般只有在排查問題時才會短暫打開。
########### 分割線 ###########
我們需要根據自己的情況進行配置優化,好的做法是MySQL服務器穩定運行了一段時間后,根據服務器的”狀態”再進行優化。
數據庫性能狀態
QueryCache命中率
Query_cache_hits=(Qcahce_hits/(Qcache_hits+Qcache_inserts))*100%;
show status like 'Qcache%';
- QPS(每秒Query量)
QPS=Questions(orQueries)/seconds
show global status like 'Question%';
- TPS(每秒事務量)
TPS=(Com_commit+Com_rollback)/seconds
show status like 'Com_commit';
show status like 'Com_rollback';
(3)keyBuffer命中率
key_buffer_read_hits=(1-key_reads/key_read_requests)*100%
key_buffer_write_hits=(1-key_writes/key_write_requests)*100%
show status like 'key%';
(4)InnoDBBuffer命中率
innodb_buffer_read_hits=(1-innodb_buffer_pool_reads/innodb_buffer_pool_read_requests)*100%
show status like 'innodb_buffer_pool_read%';
(5)QueryCache命中率
Query_cache_hits=(Qcahce_hits/(Qcache_hits+Qcache_inserts))*100%;
show status like 'Qcache%';
(6)TableCache狀態量
show status like 'open%';
(7)ThreadCache命中率
Thread_cache_hits=(1-Threads_created/connections)*100%
show status like 'Thread%';
show status like 'Connections';
(8)鎖定狀態
show status like '%lock%';
(9)復制延時量
show slave status;
(10)TmpTable狀況(臨時表狀況)
show status like 'Created_tmp%';
(11)BinlogCache使用狀況
show status like 'Binlog_cache%';
(12)Innodb_log_waits量
show status like 'innodb_log_waits';
MySQL5.7的新特性之一就是sys庫,sys庫完成MySQL信息的收集
一、用戶、連接類
1、查看每個客戶端IP過來的連接消耗資源情況。
select * from sys.host_summary;
total_connections:
current_connections:當前連接數
statement_latency:聲明延遲
statement_avg_latency:聲明平均延遲
table_scans:掃描查詢的總次數
file_IOS:
file_io_latency:
current_memory:
total_memory_allocated:
unique_users:
2、查看每個用戶消耗資源情況
select * from sys.user_summary;
user:
statements:
statement_latency:
statement_avg_latency:
table_scans:
file_ios:
file_io_latency:
current_connections:
total_connections:
unique_hosts:
current_memory:
total_memory_allocated:
3、查看當前連接情況(有多少連接就應該有多少行)
select host,current_connections,statements from sys.host_summary;
4、查看當前正在執行的SQL
select conn_id,pid,user,db,command,current_statement,last_statement,time,lock_latency from sys.session
執行show full processlist的結果
二、SQL 和io類
1、查看發生IO請求前5名的文件。
select * from sys.io_global_by_file_by_bytes order by total desc limit 5;
三、buffer pool 、內存
1、查看總共分配了多少內存
select * from sys.memory_global_total;
select * from sys.memory_global_by_current_bytes;
2、每個庫(database)占用多少buffer pool
select * from sys.innodb_buffer_stats_by_schema order by allocated desc;
pages是指在buffer pool中的page數量;
pages_old指在LUR 列表中處于后37%位置的page。
當出現buffer page不夠用時,就會征用這些page所占的空間。
37%是默認位置,具體可以自定義。
3、統計每張表具體在InnoDB中具體的情況,比如占多少頁?
注意和前面的pages的總數都是相等的,也可以借用sum(pages)運算驗證一下。
select * from sys.innodb_buffer_stats_by_table;
4、查詢每個連接分配了多少內存
利用session表和
memory_by_thread_by_current_bytes分配表進行關聯查詢。
SELECT b.USER, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated, current_statement FROM sys.memory_by_thread_by_current_bytes a, sys.SESSION b WHERE a.thread_id = b.thd_id;
四、字段、索引、鎖
1、查看表自增字段最大值和當前值,有時候做數據增長的監控,可以作為參考。
select * from sys.schema_auto_increment_columns;
2、MySQL索引使用情況統計
select * from sys.schema_index_statistics order by rows_selected desc;
3、MySQL中有哪些冗余索引和無用索引
若庫中展示沒有冗余索引,則沒有數據;當有聯合索引idx_abc(a,b,c)和idx_a(a),那么idx_a就算冗余索引了。
select * from sys.schema_redundant_indexes;
4、查看INNODB 鎖信息
在未來的版本將被移除,可以采用其他方式
select * from sys.innodb_lock_waits
5、查看庫級別的鎖信息,這個需要先打開MDL鎖的監控:
--打開MDL鎖監控
update performance_schema.setup_instruments set enabled='YES',TIMED='YES' where name='wait/lock/metadata/sql/mdl';
select * from sys.schema_table_lock_waits;
五、線程類
1、MySQL內部有多個線程在運行,線程類型及數量
select user,count(*) from sys.`processlist` group by user;
六、主鍵自增
查看MySQL自增id的使用情況
SELECT table_schema, table_name, ENGINE, Auto_increment FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ( "INFORMATION_SCHEMA", "PERFORMANCE_SCHEMA", "MYSQL", "SYS" )
一、對數據庫服務可用性進行監控
思路:
1.1 通過測試賬號ping命令返回的信息判斷數據庫可以通過網絡連接
/usr/bin/mysqladmin -uroot -p123456 ping
mysqld is alive
1.2 確認數據庫是否可讀寫
a.檢查數據庫的read_only參數是否為off
mysql -uroot -p123456 -P3306 -e "show global variables like 'read_only'" | grep read_only
read_only OFF
b.執行簡單的數據庫查詢,如:select @@version;
mysql -uroot -p123456 -P3306 -e "select @@version"
二、對數據庫性能進行監控
2.1 監控數據庫連接數可用性
a.數據庫最大連接數
mysql -uroot -p123456 -e "show variables like 'max_connections'"
b.數據庫當前打開的連接數
mysqladmin -uroot -p123456 extended-status | grep -w "Threads_connected"
注:如何計算當前打開的連接數占用最大連接數的比例呢?
result=
Threads_connected/max_connections,在做監控報警或可視化監控時能夠很好的根據這個比例及時調整最大連接數。
2.2 數據庫性能監控
a.QPS:每秒的查詢數
QPS計算方法
Questions = SHOW GLOBAL STATUS LIKE 'Questions';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
QPS=Questions/Uptime
b.TPS:每秒的事物量(commit與rollback的之和)
TPS計算方法
Com_commit = SHOW GLOBAL STATUS LIKE 'Com_commit';
Com_rollback = SHOW GLOBAL STATUS LIKE 'Com_rollback';
Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';
TPS=(Com_commit + Com_rollback)/Uptime
2.3 數據庫并發請求數量
SHOW GLOBAL STATUS LIKE 'Threads_running';
注:并發請求數量通常會遠小于同一時間內連接到數據庫的連接數量。
2.4 監控innodb阻塞情況
a. innodb
三、對主從復制進行監控
3.1 主從復制鏈路狀態的監控
3.2 主從復制延遲時間的監控
3.3 定期確認主從復制的數據是否一致