前面已经提到过了部分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
客户端连接信息表
相对而言,这些杂项表不是我们性能调优的重点,有兴趣的可以自行阅读文档