1. 理解索引状态
Key_blocks_unused: 键缓存内未使用的块数量。你可以使用该值来确定使用了多少键缓存;
Key_blocks_used: 键缓存内使用的块数量。该值为高水平线标记,说明已经同时最多使用了多少块。
Key_read_requests: 从缓存读键的数据块的请求数。
Key_reads: 从硬盘读取键的数据块的次数。如果Key_reads较大,则Key_buffer_size值可能太小。可以用Key_reads/Key_read_requests计算缓存损失率。
Key_write_requests: 将键的数据块写入缓存的请求数。
Key_writes: 向硬盘写入将键的数据块的物理写操作的次数。
A: 索引读取命中率:(Key_read_requests-Key_reads)/Key_read_requests
该值需要大于99%。若果在开启MySQL两个小时之后,这个值小于99%,则通常情况下需要增加key_buffer_size的值。
最好结合Uptime来看,因为这个值随着时间的变化而变化。
B: 索引缓存使用情况:1 - Key_blocks_unused * key_cache_block_size/ key_buffer_size
其中key_cache_block_size和key_buffer_size是服务器的配置参数。该值有些情况下不准确。
C:缓存使用最高值:Key_blocks_used* key_cache_block_size/ key_buffer_size
如果该值的大小在80%到90%,需要考虑增加key_buffer_size配置参数的值。
Handler_read_rnd: 根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键。
Handler_read_rnd_next: 在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。
Handler_read_first:索引中第一条被读的次数。如果较高,它建议服务器正执行大量全索引扫描;例如,SELECT col1 FROM foo,假定col1有索引。
Handler_read_key: 根据键读一行的请求数。如果较高,说明查询和表的索引正确。
Handler_read_next:按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加。
Handler_read_prev:按照键顺序读前一行的请求数。该读方法主要用于优化ORDER BY ... DESC。
2. Questions
Questions:发送给服务器的所有请求,包括SQL查询,MySQL命令和协议通讯等。
Queries:只是SQL语句的个数。
Slow_queries:查询时间超过long_query_time秒的查询的个数。 该值是越小越好。
Com_xxx 语句计数变量表示每个xxx 语句执行的次数。每类语句有一个状态变量。
Select_full_join:没有使用索引的联接的数量。如果该值不为0,你应仔细检查表的索引。
Select_full_range_join:在引用的表中使用范围搜索的联接的数量。
Select_range:在第一个表中使用范围的联接的数量。一般情况不是关键问题,即使该值相当大。
Select_range_check:在每一行数据后对键值进行检查的不带键值的联接的数量。如果不为0,你应仔细检查表的索引。
Select_scan:对第一个表进行完全扫描的联接的数量。
Sort_merge_passes:排序算法已经执行的合并的数量。如果这个变量值较大,应增加sort_buffer_size系统变量的值。
Sort_range:在范围内执行的排序的数量。
Sort_rows:已经排序的行数。
Sort_scan:通过扫描表完成的排序的数量。
这些状态参数的值应该越小越好。
4. Query Cache
Query Cache, 首先需要当前的MySQL版本支持,第二要打开Query Cache,通过设置Query_cache_size。
QCACHE_free_blocks:查询缓存内自由内存块的数量。
QCACHE_free_memory:用于查询缓存的自由内存的数量。
QCACHE_hits:查询缓存被访问的次数。
QCACHE_inserts:加入到缓存的查询数量。
QCACHE_lowmem_prunes:由于内存较少从缓存删除的查询数量。通常情况下,如果该值过高,则表示参数系统的配置参数Query_cache_size值过小。
QCACHE_not_cached:非缓存查询数(不可缓存,或由于query_cache_type设定值未缓存)。
Qcache_queries_in_cache:登记到缓存内的查询的数量。
Qcache_total_blocks:查询缓存内的总块数。
A: Block Fragmnt (Fragmentation): QCACHE_free_blocks/Qcache_total_blocks
平均值应该在10%-20%,若果该值过高,需要考虑减少query_cache_min_res_unit的值。
B: QCACHE_hits: 该值越高越好,表示查询命中率高。
C: 缓存增删比:QCACHE_inserts/QCACHE_lowmem_prunes
通常情况下,该值为大于50%,插入量大于删除数量。如果该值为50%甚至更小,则表示查询缓存太小,不得不删除再插入。此时需要增加Query_cache_size的大小。
D: Hit:Insert: QCACHE_hits / QCACHE_inserts
该值体现了查询缓存效率,应该大于1。如果等于1则表示查询插入缓存只使用了一次就被替换掉了,如果小于1则表示有的查询插入缓存之后没有被使用过就被替换掉了。
5. 表锁
Table_locks_immediate:立即获得的表的锁的次数。
Table_locks_waited:不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
A:锁比例:Table_locks_waited/(Table_locks_waited +Table_locks_immediate)
该值通常应小于10%
6. 其他状态参数
Open_tables:当前打开的表的数量。
Opened_tables:已经打开的表的数量,uptime时间段内。
A:平均打开表数:Opened_tables/Uptime
该值通常情况下,应小于1表/s, 如果Opened_tables较大,table_cache 值可能太小。
Connections: 试图连接到(不管是否成功)MySQL服务器的连接数。
B:平均链接数:Connections/Uptime
该值通常情况下小于5/s. 影响参数max_connections。
Bytes_received: 从所有客户端接收到的字节数。
Bytes_sent: 发送给所有客户端的字节数。
Threads_cached: 线程缓存内的线程的数量。
Threads_connected: 当前打开的连接的数量。
Threads_created: 创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。缓存访问率的计算方法Threads_created/Connections。
Threads_running: 激活的(非睡眠状态)线程数。
Created_tmp_disk_tables: 服务器执行语句时在硬盘上自动创建的临时表的数量。
Created_tmp_files: mysqld已经创建的临时文件的数量。
Created_tmp_files: 服务器执行语句时自动创建的内存中的临时表的数量。如果Created_tmp_disk_tables较大,你可能要增加tmp_table_size值使临时 表基于内存而不基于硬盘。
Uptime:MySQL运行统计时间,该值最好为24小时或以上,才具有代表性。
7. InnoDB参数
InnoDB的参数在MySQL5.0.2以上才有。
--------------buffer_pool---------------------------
Innodb_buffer_pool_pages_free: 空页数。
Innodb_buffer_pool_pages_latched: 在InnoDB缓冲池中锁定的页数。这是当前正读或写或由于其它原因不能清空或删除的页数。
Innodb_buffer_pool_pages_misc: 忙的页数,因为它们已经被分配优先用作管理。该值还可以计算为Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free -Innodb_buffer_pool_pages_data。
Innodb_buffer_pool_pages_total: 缓冲池总大小(页数)。
Innodb_buffer_pool_read_requests: InnoDB已经完成的逻辑读请求数。
Innodb_buffer_pool_reads: 不能满足InnoDB必须单页读取的缓冲池中的逻辑读数量。
Innodb_buffer_pool_wait_free: 一般情况,通过后台向InnoDB缓冲池写。但是,如果需要读或创建页,并且没有干净的页可用,则它还需要先等待页面清空。该计数器对等待实例进行记数。如果已经适当设置缓冲池大小,该值应小。
Innodb_buffer_pool_write_requests: 向InnoDB缓冲池的写数量。
--------------row_lock--------------------------------
Innodb_row_lock_current_waits:当前等待的待锁定的行数。
Innodb_row_lock_time:行锁定花费的总时间,单位毫秒。
Innodb_row_lock_time_avg: 行锁定的平均时间,单位毫秒。
Innodb_row_lock_time_max:行锁定的最长时间,单位毫秒。
Innodb_row_lock_waits:一行锁定必须等待的时间数。
其他标准:
(1)QPS(每秒Query量):QPS = Questions(or Queries) / seconds
mysql > show /*50000 global */ status like 'Question';
(2)TPS(每秒事务量):TPS = (Com_commit + Com_rollback) / seconds
mysql > show status like 'Com_commit';
mysql > show status like 'Com_rollback';
(3)key Buffer 命中率:key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%
mysql> show status like 'Key%';
(4)InnoDB Buffer命中率
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%
mysql> show status like 'innodb_buffer_pool_read%';
(5)Query Cache命中率:Query_cache_hits = (Qcahce_hits / (Qcache_hits + Qcache_inserts )) * 100%;
mysql> show status like 'Qcache%';
(6)Table Cache状态量:mysql> show status like 'open%';
(7)Thread Cache 命中率:Thread_cache_hits = (1 - Threads_created / connections ) * 100%
mysql> show status like 'Thread%';
mysql> show status like 'Connections';
(8)锁定状态
mysql> show status like '%lock%';
(9)复制延时量
mysql > show slave status
(10) Tmp Table 状况(临时表状况)
mysql > show status like 'Create_tmp%';
(11) Binlog Cache 使用状况
mysql > show status like 'Binlog_cache%';
(12) Innodb_log_waits 量
mysql > show status like 'innodb_log_waits';