檢查mysql 相關狀態值
1.關註連接數
如果連接數達到瞭最大連接數,那不管 有多少資源,用戶都會阻塞在外面。
修改mysql最大連接數:
打開my.ini,修改max_connections=100(默認為100)。
請根據硬件情況調整到合適的大小,一般經驗值可設為3000。Windows伺服器大概支持量為1500-1800個連接,linux伺服器可以支持到8000個左右。
請將max_user_connections設0——–這個0代表不限制單用戶的最大連接數,其最大連接值可以等於max_connections值。
mysql> show global status like ‘Max_used_connections’;
檢查下最大的過往使用連接數,這個值在max_connections的85%左右是比較合適的,如果過高則是max_connections過少或者系統負荷過高瞭。
①mysqladmin -uroot status
[root@mysql1 ~]# mysqladmin -uroot status
Uptime: 1742276 Threads: 2 Questions: 2538 Slow queries: 0 Opens: 145 Flush tables: 1 Open tables: 23 Queries per second avg: 0.1
②show full processlist
顯示所有進程
mysql> show full processlist;
+—–+——+———–+——+———+——+——-+———————–+
| Id | User | Host | db | Command | Time | State | Info |
+—–+——+———–+——+———+——+——-+———————–+
| 629 | root | localhost | NULL | Query | 0 | NULL | show full processlist |
| 633 | root | localhost | NULL | Sleep | 11 | | NULL |
+—–+——+———–+——+———+——+——-+———————–+
2 rows in set (0.00 sec)
如果正在運行的語句太多,運行時間太長,表示MySQL效率有問題。必要的時候可以將對應的進程kill掉。
殺死休眠的進程kill ID號
mysql> kill 633;
Query OK, 0 rows affected (0.00 sec)
關註TIME參數,看看正在運行的用戶進程有多少是長時間占用的,具體分析下。
③使用mysqlreport關註Connections,Threads
__ Connections _________________________________________________________
Max used 3 of 200 %Max: 1.50
Total 30.16k 0.7/s
。。。。。。
__ Threads _____________________________________________________________
Running 1 of 2
Cached 1 of 300 %Hit: 99.99
Created 3 0.0/s
Slow 0 0/s
2.關註下系統鎖情況
① mysql> show status like ‘%lock%’;
+——————————-+———+
| Variable_name | Value |
+——————————-+———+
| Com_lock_tables | 0 |
| Com_unlock_tables | 0 |
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
| Table_locks_immediate | 2667760 |
| Table_locks_waited | 0 |
②使用mysqlreport關註Table Locks,InnoDB Lock
__ Questions ___________________________________________________________
Total 3.38M 81.4/s
DMS 2.88M 69.3/s %Total: 85.11
QC Hits 382.70k 9.2/s 11.32
Com_ 90.50k 2.2/s 2.68
COM_QUIT 30.15k 0.7/s 0.89
+Unknown 18 0.0/s 0.00
Slow 1 s 92 0.0/s 0.00 %DMS: 0.00 Log: OFF
。。。。。。
__ Table Locks _________________________________________________________
Waited 0 0/s %Total: 0.00
Immediate 2.67M 64.2/s
。。。。。。
__ InnoDB Lock _________________________________________________________
Waits 0 0/s
Current 0
Time acquiring
Total 0 ms
Average 0 ms
Max 0 ms
。。。。。。
如果wait過多,平均時間過長,那就是查詢設計的有問題,仔細關註下超長時間的查詢,並打開slow_query_log。
3. 關註慢查詢(slow query)日志
日志必然會拖慢系統速度,特別是CPU資源,所以如果CPU資源充分,可以一直打開,如果不充足,那就在需要調整的時候,或者在replication從伺服器上打開(針對select)
mysql> show variables like ‘%slow%’;
+———————+—————————————-+
| Variable_name | Value |
+———————+—————————————-+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /data0/mysql/3306/data/mysql1-slow.log |
+———————+—————————————-+
4 rows in set (0.00 sec)
mysql> set GLOBAL slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)
①關註慢查詢涉及的表的相關狀態
表內記錄數。盡量控制在500萬行以內(有索引),建議控制在200萬行
表內索引的使用。
表如果update,delete,insert頻繁,可以考慮optimize table優化下文件存放,索引,存儲空間。
表內update,insert,delete查詢的鎖定時間。
select for update如果條件字段無索引的話,會引起的是鎖全表而不是行鎖,請關註。
如果查詢包括GROUP BY但你想要避免排序結果的消耗,你可以指定ORDER BY NULL禁止排序。
②定期分析表
ANALYZE TABLE
語法:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
本語句用於分析和存儲表的關鍵字分佈。在分析期間,使用一個讀取鎖定對表進行鎖定。這對於MyISAM, BDB和InnoDB表有作用。對於MyISAM表,本語句與使用myisamchk -a相當。
CHECK TABLE
語法:
CHECK TABLE tbl_name [, tbl_name] … [option] …
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
檢查一個或多個表是否有錯誤。CHECK TABLE對MyISAM和InnoDB表有作用。對於MyISAM表,關鍵字統計數據被更新。
CHECK TABLE也可以檢查視圖是否有錯誤,比如在視圖設定中被引用的表已不存在。
CHECKSUM TABLE
語法:
CHECKSUM TABLE tbl_name [, tbl_name] … [ QUICK | EXTENDED ]
報告一個表校驗和。
③使用optimize table
OPTIMIZE TABLE
語法:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …
如果已經刪除瞭表的一大部分,或者如果您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行瞭很多更改,則應使用OPTIMIZE TABLE。被刪除的記錄被保持在鏈接清單中,後續的INSERT操作會重新使用舊的記錄位置。您可以使用OPTIMIZE TABLE來重新利用未使用的空間,並整理數據文件的碎片。
OPTIMIZE TABLE隻對MyISAM, BDB和InnoDB表起作用。