天天看点

[MySQL 5.6] Performance Schema 表类型纵览 (3)1.SETUP table配置表2.CURRENT EVENT table3.HISTORY table4.SUMMARY table5.INSTANCE table6.其他杂项表

前面已经提到过了部分performance schema表,这里再总结下,ps库下主要分为几类表

<code></code>

该表列出了当前线程正在等待的事件,主要包括以下几列:

thread_id:线程id

event_id:当前线程的事件id,和thread_id组成一个primary key.

end_event_id:当事件开始时,这一列被设置为null。当事件结束时,再更新为当前的事件id

event_name:产生该事件的instrument名

source:该事件产生时的源码文件;例如如果在等待一个mutex,查看对应的源码,就可以知道在那里被阻塞住。

<code>timer_start</code>, <code>timer_end</code>, <code>timer_wait:事件开始/结束和等待的时间,单位为皮秒(</code>picoseconds)

spins:互斥锁或读写锁spin的次数<code></code>

<code>object_schema</code>, <code>object_name</code>, <code>object_type</code>, <code>object_instance_begin:这几列的值取决于不同的对象类型</code>

<code>     a.对于</code><code>cond</code>, <code>mutex</code>, <code>rwlock类型,</code><code>object_schema</code>, <code>object_name</code>, 以及 <code>object_type</code> 的值为<code>null</code>.object_instance_begin表示该同步对象创建的内存地址

     b.对于文件io对象,object_schema为null,object_name为文件名,object_type为file,object_instance_begin是内存地址。

     c.对于socket对象,object_name为该socket的ip:sock值,object_instance_begin是对象内存地址

     d.对于表i/o对象,object_schema是表的schema名,object_name是表名,object_type为table或者temporary table,object_instance_begin是对象的内存地址

index:使用到的索引名

nesting_event_id:该事件锁嵌套在的事件id,

nesting_event_type:嵌套事件类型(statement, stage, wait)

operation:操作类型(lock, read, write)

number_of_bytes:该操作读或写的比特数,对于表的i/o对象,number_of_bytes值为null

flags:预留列

stage表中列出了一条sql执行的过程,例如解析sql,打开一个表,或者执行一次filesort操作等等,可以与show processlist结合起来。该表每一行显示了该线程最近的一条记录

主要包括以下几列:

thread_id:线程id

event_id:事件id

end_event_id:刚结束的事件id,以上三列的含义和wait表的相同

source:源码位置

<code>timer_start</code>, <code>timer_end</code>, <code>timer_wait:本阶段开始、结束以及持续的时间;如果事件没有结束,</code>timer_end和timer_wait值为null;如果该事件对应的instrument的timed列设置为no(setup_instruments),这三列的值都为null

nesting_event_id:当前事件被嵌套的事件id,一个stage事件的嵌套事件通常是一个statement事件

nesting_event_type:嵌套事件类型(statement, stage 或者wait)

对statement的监控从发现一个线程活跃开始,到线程的活跃行为结束。换句话说,是从服务器接受客户端的第一个通信包开始,到服务器发送完所有的响应,监控只发生在最顶层的语句,对于在语句中包含的存储过程或者子查询不会单独列出。

从客户端发出的一个请求,既可以是一个command,也可以是一条sql,通过statement/com 和statement/sql来划分,再往下划分就是具体的sql类型或者command。

另外还有一些错误处理的instrument:

statement/com/error:用于处理服务器不能理解的command

statement/sql/error:用于处理无法解析的sql。

在刚开始服务器接受到一条sql时,先将看做statement/com/query,在完成解析后,再将其设置成statement/sql/*

该表的列比较多,主要包括:

thread_id、event_id、end_event_id、event_name、source:和上面介绍的两个表含义类似,这里不再赘述

lock_time:等待表锁的时间

sql_text:sql语句,对于command,值为null

digest:该sql格式化后的 md5值,需要statement_digest打开才生效

digest_text:该sql格式化后的字符串,需要statement_digest打开才生效

current_schema:该sql的默认链接的数据库

<code>object_schema</code>, <code>object_name</code>, <code>object_type:保留列,值为null</code>

object_instance_begin:用于标示该对象在内存中的地址<code></code>

mysql_errno:该sql产生的错误号

returned_sqlstate:sqlstate值

message_text:错误信息

errors:是否发生错误,如果sqlstate值以00(完成) 或者01(警告)开始,值为0;否则为1

warnings:告警次数,以上列都取自该sql的diagnostics area

rows_affected:该sql影响的行数

rows_sent:发送到客户端的行数

rows_examined:在sql执行过程中从存储引擎读取的记录数

created_tmp_disk_tables、created_tmp_tables、select_full_join、select_full_range_join、select_range、select_range_check、select_scan、sort_merge_passes、sort_range、sort_rows、sort_scan:这些列的名字也有对应的status变量,含义相同,但这里只针对当前这个sql的统计。

no_index_used:如果sql执行了一次全表扫描,没有用到索引的话值为1,否则为0

<code>nesting_event_id</code>, <code>nesting_event_type:保留列,当前值为null</code>

<code>history/history long表跟cureent 表结构类似,只是存储的数据量不同,这里不再赘述。</code>

<code>汇总表,对事件信息进行聚集。</code>

<code>汇总表是我们关注的重点,因为它省略了人工处理数据的过程,由服务器来进行数据聚集。</code>

<code>主要包括以下几种:</code>

这三个表分别根据event名/instance(event_name、object_instance_begin)以及(thread_id,event_name)进行聚合,聚合列包括:

count_star:事件计数

sum_timer_wait:总的等待时间

min_timer_wait:最小等待时间

avg_timer_wait:平均等待时间

同样包含<code>count_star</code>, <code>sum_timer_wait</code>, <code>min_timer_wait</code>, <code>avg_timer_wait</code>, <code>max_timer_wait</code>

除了<code>count_star</code>, <code>sum_timer_wait</code>, <code>min_timer_wait</code>, <code>avg_timer_wait</code>, <code>max_timer_wait,还包括:</code>

sum_<code>xxx:一些状态信息的sum值,例如</code><code>sum_lock_time、sum_errors等等</code>

<code>first_seen_timestamp</code>, <code>last_seen_timestamp,该sql的摘要(digest)信息第一次生成,以及最近一次生成的时间戳。</code><code></code>

聚合的sql在digest表中生成的规则:

a.存在对应的格式化的sql,将其信息聚合到该记录中,更新last_seen_timestamp

b.新的记录加入到表中(表未满),first_seen_timestamp和last_seen_timestamp更新为当前时间

internal lock通过sql层函数thr_lock调用,显示在operation这一列,有如下值:

read normal 

read with shared locks 

read high priority 

read no insert 

write allow write 

write concurrent insert 

write delayed 

write low priority 

write normal

external lock则通过接口函数handler::external_lock调用存储引擎层,operation列的值为:

read external

write external

<code>实例表记录了当前被监控的事件状态,主要包括以下几种:</code>

列出当前正在运行的condition wait对象,只包含两列:

name:正在等待的instrument名

object_instance_begin: 该condition被监控时的内存地址

当执行file io instrument时的文件信息,当一个文件从未被打开时,不会在其中显示,如果从磁盘上删除了文件,也会从该表中删除。

包含3列:

name:文件名

event_name:instrument名

open_count:当前文件打开的次数;如果一个文件先打开,再关闭了,这个文件的open_count值为0.

列出了所有当前等待的互斥量,该表包含三列:

name:该mutex的命名

object_instance_begin:对象实例的内存地址

locked_by_thread_id:当前锁住该互斥量的线程id

对于每一个mutex instrument,ps提供了以下信息:

d.当一个线程成功锁住一个mutex,会

e.当该mutex被释放时,locked_by_thread_id列被设置为null

通过在以下两个表上执行查询,可以有助于发现性能瓶颈:

name: 该读写锁instrument命名

object_instance_begin:被创建时的内存地址

write_locked_by_thread_id:当前持有写锁的线程id

read_locked_by_count:读锁计数器

记录当前所有的实时socket连接对象。主要包括两种监听socket(server_tcpip_socket或者server_unix_socket)以及一种客户端连接(client_connection),当一个用户线程中断,对应的记录被删除。

该表主要包含以下几列:

event_name:命名为 <code>wait/io/socket/*</code>

object_instance_begin:该对象的内存地址<code></code>

socket_id: 内部socket id

ip:客户端ip地址

port:客户端端口号

state:用户线程状态,idle或者active

客户端连接信息表

相对而言,这些杂项表不是我们性能调优的重点,有兴趣的可以自行阅读文档