第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命令。

 

posted @ 2014-08-22 11:16  thrillerz  阅读(681)  评论(0编辑  收藏  举报