第13章 MySQL服务器的状态--高性能MySQL学习笔记
13.1 系统变量 -- 服务器配置变量
MySQL通过SHOW VARIABLES SQL命令显示许多系统变量。
13.2 状态变量--SHOW STATUS
SHOW STATUS 命令会在一个由两列(名称/值)组成的表格里显示服务器状态变量。这些变量都是只读的。
SHOW STATUS默认显示会话变量,SHOW GLOBAL STATUS显示全局变量。
也可以从INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATION_SCHEMA.SESSION_STATUS表里取出。
32位系统很多计数器会归零。64位很少出现。
查看这些变量的最好办法是:在时长为几分钟的时间段里看它们改变了多少。
下面简要介绍,所有变量还得看MySQL手册。
13.2.1 线程和链接统计信息
Connections, Aborted_connects......
eg: 每秒创建线程数(Threads_created/Uptime)。如果这个值跟0没差太多,说明线程缓冲区太小。
13.2.2 二进制日志的状态
Binlog_cache_use 和Binlog_cache_disk_use状态变量可以显示二进制日志保存了多少个事务。
13.2.3 命令计数器
Com_*变量记录了已发出的每一种SQL或者C API命令的数目。
eg:Com_select记录SELECT语句的数目,
Com_change_db记录使用USE或者通过C API改变一条默认连接数据库的次数。
Com_admin_commands状态变量可能很大,它不仅记录管理命令的数目,也记录发给MySQL实例的ping请求数量。
Questions记录了服务器受到的查询和命令的总数。因为缓存等因素,Com_*变量的总数并不完全相等。
13.2.4临时文件和表
查看记录MySQL创建临时表和文件次数的变量:
mysql> SHOW GLOBAL STATUS LIKE 'Created_tmp%';
13.2.5 Handler操作
Handler API是MySQL与存储引擎之间的接口。Handler_*变量记录了Handler的操作次数。
研读Handler_*变量可以让你看清楚服务器做得最多的是哪几种工作。
13.2.6 MyISAM索引键缓冲区
Key_*变量包含了MyISAM索引键缓冲区的度量值和计数器。
13.2.7文件描述符
Open_*变量。
如果主要使用MyISAM引擎,那查看文件描述符的统计信息就很重要。
13.2.8 查询缓存
通过Qcache_*状态变量来检查查询缓存。
13.2.9 各种类型的SELECT
Select_*变量记录了各种类型SELECT查询的次数。
Select_range:一种联接的数目,该联接在第一个表的索引的指定范围内做扫描。
Select_scan:对第一个表做全表扫描的联接数目。
Select_full_range_join:....
Select_range_check:.这种查询计划代价很高。
Select_full_join:很糟糕。
13.2.10 排序
Sort_*变量
13.2.11表锁定
Table_locks_immediate,Table_locks_waited......
13.2.12 Secure Socket Layer (SSL)
Ssl_*变量显示服务器是如何配置SSL的。
13.2.13 InnoDB特有变量
InnoDB_*变量显示的是包含在SHOW INNODB STATUS的一些数据。
在低版本(5.0)有副作用:创建全局锁,遍历InnoDB缓存池,阻塞其他线程,知道锁释放。
13.2.14 Plug-in特有得变量
插件式存储引擎-相关变量
13.2.15 其他
Delayed_*, Not_flushed_delayed_rows
这些变量INSERT SELAYED查询的计数器和度量值
Last_query_cost
查询优化器的查询计划在最近一次执行查询时的开销。
Ndb_*
NDB Cluster的配置信息(如果是正确配置的话)
Slave_*
复制从服务器时启用
Tc_log_*
记录服务器被用作XA事务协调器的次数
Uptime
服务器正常运行的时间,以秒为单位
想了解系统总体工作负荷最好途径就是比较一组相关的状态变量。
13.3 SHOW INNODB STATUS
在 SHOW ENGINE INNODB STATUS(或:SHOW INNODB STATUS)的输出里,InnoDB存储引擎显示出了大量的内部信息。
它输出的就是单独的字符串。它分为很多节,每一节对应了InnoDB存储引擎不同部分的信息。
ps:innodb把64位数字分两部分打印:高32位和低32位,例如事务ID,TRANSACTION 0 3793469
13.3.1 头部信息
eg: Per second averages calculated from the last 45 seconds
每秒平均从最后45秒计算
......
13.3.2 SEMAPHORE --信号量
如果有高并发工作负荷,就需要关注这一段信号量。
它包含了两种数据: 1 时间计数器 2 当前等待线程的列表
OS WAIT ARRAY INFO: reservation count 4, signal count 4:
操作系统等待阵列信息,是一个“插槽”式的阵列,InnnDB保留了阵列里的一些插槽给信号量使用,操作系统用这些信号量给线程发送信号,使线程可以继续运行。reservation count 显示InnoDB分配插槽的额度,signal count 衡量的是线程通过阵列得到信号的频度。
Mutex spin waits 0, rounds 1750203, OS waits 40912:
跟互斥量相关的几个计数器
RW-shared spins 197079, OS waits 91344; RW-excl spins 38238, OS waits 258:
显示读/写共享和排斥锁的计数器
......
13.3.3 LATEST FOREIGN KEY ERROR --外键错误
......
13.3.4 LATEST DETECTED DEADLOCK -- 服务器内死锁
......
13.3.5 TRANSACTION
InnoDB事务的一些摘要信息,它们跟随在当前活动事务目录之后。
Trx id counter 0 10209388:
当前事务的ID,它是一个系统变量,每创建一个新事务就会累加。
Purge done for trx's n:o < 0 10208813 undo n:o < 0 0:
这是InnoDB清除旧版本MVCC行时所用的事务ID。通过这个值和当前事务ID的比较,你会看到有多少老版本的数据已经被清除掉了。.......
InnoDB清除进程正在使用的撤销日志编号: 如果是" 0 0 "说明清除进程处于空闲状态。
History list length 594:
历史记录长度,它就是位于InnoDB数据文件的撤销空间里的未清除事务的数目。当一个事务执行了更新并提交后,这个数字就会累加。当清除进程移除一个旧版本数据时,它就会递减。
Total number of lock structs in row lock hash table 0:
锁结构的数目。每个锁结构经常持有多个行锁。
头部信息之后就是一个事务列表。
---TRANSACTION 0 0, not started, process no 2119, OS thread id 1186466112:
以事务ID和状态开始,......
MySQL thread id 14236333, query id 82167872 127.0.0.1 root:
mysql进程ID,内部查询码等其他信息......
......
13.3.6 FILE I/O -- I/O helper 线程的状态,用性能计数器的方式来表达:
1 --------
2 FILE I/O
3 --------
//第4到7行显示的就是 I/O helper 线程当前状态
4 I/O thread 0 state: waiting for i/o request (insert buffer thread) //插入缓冲区线程--负责插入缓冲区的合并
5 I/O thread 1 state: waiting for i/o request (log thread) //日志线程--负责异步的日志刷新
6 I/O thread 2 state: waiting for i/o request (read thread) //读线程,负责读前置(Read-ahead)的操作,预测InnoDB将要使用的数据,并将他们预读进来
7 I/O thread 3 state: waiting for i/o request (write thread) //写线程--刷新 脏 缓冲区
//第8到10行显示的是每个helper线程还没完成的操作数目
8 Pending normal aio reads: 0, aio writes: 0,
9 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
10 Pending flushes (fsync) log: 0; buffer pool: 0
11 3021 OS file reads, 1175492 OS file writes, 575175 OS fsyncs //读,写及fsync()调用的执行次数
//第12行显示的是在头部信息指明的那段时间,平均每秒执行各种操作的次数
12 0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
13.3.7 INSERT BUFFER AND ADAPTIVE HASH INDEX:
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, //插入缓冲区的大小
15 inserts, 15 merged recs, 15 merges //显示了InnoDB已经做了多少次缓冲区操作
Hash table size 2212699, used cells 57809, node heap has 88 buffer(s) //自适应哈希索引的状态
64.93 hash searches/s, 30.33 non-hash searches/s //根据头部信息期限内,散列索引查找次数和非散列索引查找次数
13.3.8 LOG
---
LOG
---
Log sequence number 0 1259958998 //当前日志的顺序号
Log flushed up to 0 1259958998 //日志已经刷新到的点位
Last checkpoint at 0 1259958998 //最近的一个检查点
//下面两行显示了还未完成的日志操作和统计信息
0 pending log writes, 0 pending chkp writes
553796 log i/o's done, 0.00 log i/o's/second
13.3.9 BUFFER POOL AND MEMORY
1 ----------------------
2 BUFFER POOL AND MEMORY
3 ----------------------
//InnoDB申请内存总数,以及其中有多少是在附加内存池申请到的
4 Total memory allocated 1239085970; in additional pool allocated 16324352
//第5到8行显示了缓冲池的度量值,以页为单位。
5 Buffer pool size 65536
6 Free buffers 55165
7 Database pages 10283
8 Modified db pages 0 //显示缓冲池容纳脏页的数目
//第9到10行显示了未完成的读和写的数目, LRU(最少最近使用)
9 Pending reads 0
10 Pending writes: LRU 0, flush list 0, single page 0
11 Pages read 3406, created 49455, written 676980 //显示了InnoDB已经读,创建,写了多少页
12 0.00 reads/s, 0.00 creates/s, 0.00 writes/s
13 Buffer pool hit rate 1000 / 1000 //缓冲池命中率
13.3.10 ROW OPERATIONS 显示 row operations 及其它各色各样的InnoDB统计信息
1 --------------
2 ROW OPERATIONS
3 --------------
4 0 queries inside InnoDB, 0 queries in queue //显示InnoDB有多少条线程
5 1 read views open inside InnoDB //InnoDB已经打开了多少个读视图
6 Main thread process no. 2119, id 1168361792, state: waiting for server activity //内核主线程状态
// 7,8行显示了行插入,更新,删除和读取次数的统计信息,以及这些数值每秒平均值
7 Number of rows inserted 228379, updated 101797, deleted 2734, read 1311217263
8 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 94.26 reads/s
13.4 SHOW PROCESSLIST -当前正连接到MySQL的线程列表
Command 和 State列救市线程真正显示‘状态’的地方。
SHOW FULLPROCESSLIST 显示每一条查询的全部文本。
13.5 SHOW MUTEX STATUS
InnoDB互斥量的细节信息,通常用于深入观察系统的伸缩性和并发性的问题。
在代码里,每一个互斥量保护着一块临界区。
......
13.6 复制的状态
MySQL有几个命令是用于监控复制的。......
13.7 INFORMATION_SCHEMA
INFORMATION_SCHEMA数据库里是一套按照SQL标准定义的系统视图。
许多视图对应于MySQL的SHOW命令。