一、查看mysql鎖相關命令
1、通過INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS 獲取事務與鎖的信息
1)查看哪些事務正在執行
命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
trx_state表示事務的狀態
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX \G *************************** 1. row *************************** trx_id: 4391 trx_state: LOCK WAIT //事務狀態,LOCK WAIT表示等待鎖 trx_started: 2019-09-27 11:39:09 trx_requested_lock_id: 4391:57:962:104 trx_wait_started: 2019-09-27 11:39:09 trx_weight: 2 trx_mysql_thread_id: 9 //線程ID trx_query: select * from employees where birth_date = '1953-09-02' for update trx_operation_state: starting index read trx_tables_in_use: 1 trx_tables_locked: 1 trx_lock_structs: 2 trx_lock_memory_bytes: 1136 trx_rows_locked: 1 trx_rows_modified: 0 trx_concurrency_tickets: 0 trx_isolation_level: REPEATABLE READ trx_unique_checks: 1 trx_foreign_key_checks: 1 trx_last_foreign_key_error: NULL trx_adaptive_hash_latched: 0 trx_adaptive_hash_timeout: 0 trx_is_read_only: 0 trx_autocommit_non_locking: 0 *************************** 2. row *************************** trx_id: 4390 trx_state: RUNNING //事務狀態,RUNNING表示正在運行的事務,如果一直運行中,有可能是block了 trx_started: 2019-09-27 11:38:41 trx_requested_lock_id: NULL trx_wait_started: NULL trx_weight: 65 trx_mysql_thread_id: 20 //線程ID trx_query: NULL trx_operation_state: NULL trx_tables_in_use: 0 trx_tables_locked: 1 trx_lock_structs: 65 trx_lock_memory_bytes: 8400 trx_rows_locked: 127 trx_rows_modified: 0 trx_concurrency_tickets: 0 trx_isolation_level: REPEATABLE READ trx_unique_checks: 1 trx_foreign_key_checks: 1 trx_last_foreign_key_error: NULL trx_adaptive_hash_latched: 0 trx_adaptive_hash_timeout: 0 trx_is_read_only: 0 trx_autocommit_non_locking: 0 2 rows in set (0.00 sec)
2)查看當前鎖定的事務
命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
mysql> select * from information_schema.INNODB_LOCKS\G *************************** 1. row *************************** lock_id: 17778:82:3:6 --當前鎖ID lock_trx_id: 17778 --該鎖對應的事務ID lock_mode: X -- 鎖類型,排它鎖X lock_type: RECORD --鎖范圍,記錄鎖:record lock,其他鎖范圍:間隙鎖:gap lock,或者next-key lock(記錄鎖+間隙鎖) lock_table: `test`.`trx_fee` lock_index: PRIMARY --加載在哪個索引上的鎖 lock_space: 82 lock_page: 3 lock_rec: 6 lock_data: 4 *************************** 2. row *************************** lock_id: 17773:82:3:6 lock_trx_id: 17773 lock_mode: X lock_type: RECORD lock_table: `test`.`trx_fee` lock_index: PRIMARY lock_space: 82 lock_page: 3 lock_rec: 6 lock_data: 4
3)查看當前正在等待鎖的事務
命令:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
mysql> select * from information_schema.INNODB_LOCK_WAITS\G *************************** 1. row *************************** requesting_trx_id: 17778 --請求鎖的事務ID(等待方) requested_lock_id: 17778:82:3:6 -- 請求鎖ID blocking_trx_id: 17773 -- 阻塞該鎖的事務ID(當前持有方,待釋放) blocking_lock_id: 17773:82:3:6 -- 持有的鎖ID
2、查詢鎖爭用情況
1)查詢表級鎖爭用情況
可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析表鎖爭奪情況。
mysql> show status like 'table%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Table_locks_immediate | 6165 |
| Table_locks_waited | 0 |
| Table_open_cache_hits | 0 |
| Table_open_cache_misses | 0 |
| Table_open_cache_overflows | 0 |
+----------------------------+-------+
變量解釋:
table_lock_waited 表示不能馬上獲得鎖的數量
table_lock_immediate表示馬上獲得鎖的數量
2)查看記錄鎖使用情況
mysql> show status like 'innodb_row_lock_%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 1896 |
| Innodb_row_lock_time_avg | 6 |
| Innodb_row_lock_time_max | 193 |
| Innodb_row_lock_waits | 274 |
+-------------------------------+-------+
變量解釋:
Innodb_row_lock_current_waits:當前等待鎖的數量
Innodb_row_lock_time:系統啟動到現在,鎖定的總時間長度
Innodb_row_lock_time_avg:每次平均鎖定的時間
Innodb_row_lock_time_max:最長一次鎖定時間
Innodb_row_lock_waits:系統啟動到現在總共鎖定的次數
二、查看MySQL的運行狀態
我們需要了解MySQL的服務器狀態信息,比如查看當前MySQL啟動后的運行時間,MySQL的客戶端會話連接數,MySQL服務器執行的慢查詢數,MySQL執行了多少SELECT/UPDATE/DELETE/INSERT語句等統計信息。查看MySQL運行狀態,優化MySQL運行效率,就需要使用show status命令。
1、線程緩存命中率
1)查看當前連接數
命令:SHOW STATUS LIKE 'Thread_%';
Thread_cached:被緩存的線程的個數
Thread_running:處於激活狀態的線程的個數
Thread_connected:當前連接的線程的個數
Thread_created:總共被創建的線程的個數
Thread Cache Hits
Thread_connected = SHOW GLOBAL STATUS LIKE Thread_created;
Connections = SHOW GLOBAL STATUS LIKE 'Connections';
TCH = (1 - ( Threads_created / Connections ) ) * 100
如果TCH數小於90%,說明命中率不高,創建連接耗費了不少時間,可以考慮加大 thread_cache_size 變量值來增大Thread_cached的數量。
2)線程緩存大小 thread_cache_size
當客戶端斷開連接之后,MySQL會把線程緩存起來以響應下一個請求而不是直接銷毀(前提是緩存數未達上限)
查看thread_cache_size的值:
show global variables like 'thread_cache_size';
設置thread_cache_size大小:
如果是短連接,可以適當設大一點。因為短連接往往需要不停地創建和銷毀。如果設大一點,重新創建和銷毀的數量會小一些,對性能提升有較大的作用。
如果是長連接,如果是長連接,可以適當設置小一點。
物理內存設置規則:
可以大致根據物理內存來設置,1G-->8、2G-->16、3G-->32、4G-->64
兩種設置方法:
mysql> set global thread_cache_size = 16
編輯/etc/my.cnf 更改/添加 thread_concurrency = 16
2、QPS、TPS 和 RW Ratio
幾個重要參數:
Qcache_hits:查詢緩存命中次數
SHOW GLOBAL STATUS LIKE 'Qcache_hits';
Com_select:總的查詢語句量
SHOW GLOBAL STATUS LIKE 'Com_select';
Com_insert:執行插入語句量
SHOW GLOBAL STATUS LIKE 'Com_insert';
Com_update:執行更新語句量
SHOW GLOBAL STATUS LIKE 'Com_update';
Com_delete:執行刪除語句量
SHOW GLOBAL STATUS LIKE 'Com_delete';
Com_replace:執行字符串替換語句量
SHOW GLOBAL STATUS LIKE 'Com_replace';
Uptime:本次啟動服務到現在執行的時長
SHOW GLOBAL STATUS LIKE 'Uptime';
1)QPS,每秒查詢量
基於Questions計算QPS。Questions表示發送給服務器的查詢數量
Questions:
SHOW GLOBAL STATUS LIKE 'Questions';
QPS = Questions / Uptime
基於com_*計算QPS。Com_select表示查詢語句執行數量
QPS = Com_select / Uptime
使用Questions進行計算QPS時,人為拉高了計算結果。相對來說,使用Com_select這種計算方式更符合實際一些。
2)TPS,每秒事務量
服務器每秒處理的事務數,如果是InnoDB會顯示,沒有InnoDB就不會顯示。
基於Com_commit和Com_rollback計算。Com_commit表示執行的事務提交次數,Com_rollback表示執行的事務回滾次數
Com_commit:
SHOW GLOBAL STATUS LIKE 'Com_commit';
Com_rollback:
SHOW GLOBAL STATUS LIKE 'Com_rollback';
TPS = (Com_commit + Com_rollback) / Uptime
QPS 和 TPS值一定要實時監控,如果接近架構搭建時的測試峰值,表示系統壓力很大
3)R/W Ratio,讀寫比
Read/Writes Ratio,數據庫讀寫比
R/W = (Com_select + Qcache_hits) / (Com_insert + Com_update + Com_delete + Com_replace) * 100
讀寫比:優化數據庫的重要依據,讀的多優化讀,寫的多優化寫
3、慢查詢、無索引 join查詢
1)慢查詢
/*查看慢查詢時間 */
show variables like "long_query_time";默認10s
/*查看慢查詢配置情況 */
show status like "%slow_queries%";
/*查看慢查詢日志路徑 */
show variables like "%slow%";
=======================================
/*開啟慢日志 */
set global slow_query_log = ON;
/*設置慢查詢時間 2s */
set global long_query_time = 2;
/*設置慢查詢日志路徑 */
set global slow_query_log_file='/usr/local/mysql/data/slow.log';
/*設置無索引的查詢,設置后沒有使用索引的查詢也會被認為是慢查詢 */
set global log_queries_not_using_indexes = ON;
======================================
Slow queries per minute
Slow_queries:
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SQPM = Slow_queries/(Uptime/60)
S/Q = Slow_queries/Questions
新版本上線時要重點關注慢查詢,出現慢查詢sql,要盡快優化。
2)無索引join查詢
Full_join per minute
Select_full_join:
SHOW GLOBAL STATUS LIKE 'Select_full_join';
FJPM = Select_full_join / (Uptime / 60)
沒有使用索引而造成的全表掃描的join,需要優化索引。
4、buffer 和cache設置
Innodb buffer read hits,buffer命中率
Innodb_buffer_pool_reads:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
Innodb_buffer_pool_read_requests:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
IFRH = (1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100
InnoDB Buffer命中率,目標95%-99%;
Table Cache,表緩存
Open_tables:
SHOW GLOBAL STATUS LIKE 'Open_tables';
Opened_tables:
SHOW GLOBAL STATUS LIKE 'Opened_tables';
table_cache:
SHOW GLOBAL STATUS LIKE 'table_cache';
table_cache應該大於Open_tables小於Opened_tables
https://www.cnblogs.com/yuqiandoudou/p/4665537.html