www.27111.comMySQL Performance-Schema(二) 理论篇

1row inset ( 0. 00sec)

| events_statements_summary_by_user_by_event_name |

MySQL Performance-Schema(二) 理论篇,performanceschema

     MySQL
Performance-Schema中累计蕴涵53个表,首要分为几类:Setup表,Instance表,Wait
伊夫nt表,Stage 伊芙nt表Statement
伊夫nt表,Connection表和Summary表。上1篇作品已经首要讲了Setup表,那篇文章将会分别就每体系型的表做详细的叙述。

Instance表
   
 instance中关键含有了5张表:cond_instances,file_instances,mutex_instances,rwlock_instances和socket_instances。
(1)cond_instances:条件等待对象实例
表中著录了系统中动用的准绳变量的目的,OBJECT_INSTANCE_BEGIN为指标的内部存款和储蓄器地址。比如线程池的timer_cond实例的name为:wait/synch/cond/threadpool/timer_cond

(2)file_instances:文件实例
表中记录了系统中开采了文本的对象,包含ibdata文件,redo文件,binlog文件,用户的表文件等,比如redo日志文件:/u01/my3306/data/ib_logfile0。open_count展现当前文件展开的数据,要是重来未有展开过,不会出现在表中。

(3)mutex_instances:互斥同步对象实例
表中记录了系统中选取互斥量对象的具备记录,当中name为:wait/synch/mutex/*。比如打开文件的互斥量:wait/synch/mutex/mysys/THTiggo_LOCK_open。LOCKED_BY_THREAD_ID突显哪个线程正持有mutex,若未有线程持有,则为NULL。

(4)rwlock_instances: 读写锁同步对象实例
表中著录了系统中使用读写锁对象的享有记录,在那之中name为
wait/synch/rwlock/*。WRITE_LOCKED_BY_THREAD_ID为正值有着该对象的thread_id,若未有线程持有,则为NULL,READ_LOCKED_BY_COUNT为记录了同时有微微个读者持有读锁。通过
events_waits_current
表能够领略,哪个线程在伺机锁;通过rwlock_instances知道哪位线程持有锁。rwlock_instances的欠缺是,只好记录持有写锁的线程,对于读锁则无从。

(5)socket_instances:活跃会话对象实例
表中著录了thread_id,socket_id,ip和port,其它表能够经过thread_id与socket_instance进行关联,获取IP-PORT音讯,能够与使用接入起来。
event_name首要涵盖3类:
wait/io/socket/sql/server_unix_socket,服务端unix监听socket
wait/io/socket/sql/server_tcpip_socket,服务端tcp监听socket
wait/io/socket/sql/client_connection,客户端socket

Wait Event表
     
Wait表首要含有一个表,events_waits_current,events_waits_history和events_waits_history_long,通过thread_id+event_id能够唯一显著一条记下。current表记录了目前线程等待的事件,history表记录了各类线程近来拭目以俟的拾个事件,而history_long表则记录了方今具备线程产生的一千0个事件,那里的拾和10000都是足以布署的。那两个表表结构一样,history和history_long表数据都源于current表。current表和history表中大概会有重新事件,并且history表中的事件都以成功了的,未有终结的轩然大波不会加盟到history表中。
THREAD_ID:线程ID
EVENT_ID:当前线程的事件ID,和THREAD_ID组成八个Primary Key。
END_EVENT_ID:当事件开始时,这壹列棉被服装置为NULL。当事件甘休时,再立异为当下的轩然大波ID。
SOULX570CE:该事件时有产生时的源码文件
TIMER_START, TIMER_END,
TIMER_WAIT:事件开首/截止和等候的时间,单位为微秒(picoseconds)

OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE视景况而定
对此联合对象(cond, mutex, rwlock),这一个一个值均为NULL
对于文本IO对象,OBJECT_SCHEMA为NULL,OBJECT_NAME为文件名,OBJECT_TYPE为FILE
对于SOCKET对象,OBJECT_NAME为该socket的IP:SOCK值
对于表I/O对象,OBJECT_SCHEMA是表的SCHEMA名,OBJECT_NAME是表名,OBJECT_TYPE为TABLE或者TEMPORARY
TABLE
NESTING_EVENT_ID:该事件对应的父事件ID
NESTING_EVENT_TYPE:父事件类型(STATEMENT, STAGE, WAIT)
OPERATION:操作类型(lock, read, write)

Stage Event表 

     
 Stage表首要涵盖一个表,events_stages_current,events_stages_history和events_stages_history_long,通过thread_id+event_id可以唯壹明确一条记下。表中记录了方今线程所处的施行阶段,由于能够清楚各种阶段的实行时间,因而通过stage表能够获取SQL在各样阶段消耗的年华。

THREAD_ID:线程ID
EVENT_ID:事件ID
END_EVENT_ID:刚甘休的轩然大波ID
SOU途胜CE:源码地方
TIMER_START, TIMER_END,
TIMER_WAIT:事件开始/停止和等候的时光,单位为微秒(picoseconds)
NESTING_EVENT_ID:该事件对应的父事件ID
NESTING_EVENT_TYPE:父事件类型(STATEMENT, STAGE, WAIT)

Statement Event表
     
Statement表首要包蕴2个表,events_statements_current,events_statements_history和events_statements_history_long。通过thread_id+event_id能够唯一鲜明一条记下。Statments表只记录最顶层的呼吁,SQL语句或是COMMAND,每条语句一行,对于嵌套的子查询或许存款和储蓄进程不会独自列出。event_name形式为statement/sql/*,或statement/com/*
SQL_TEXT:记录SQL语句
DIGEST:对SQL_TEXT做MD5发出的33人字符串。假设为consumer表中没有展开statement_digest选项,则为NULL。
DIGEST_TEXT:将讲话中值部分用问号代替,用于SQL语句归类。即使为consumer表中平昔不张开statement_digest选项,则为NULL。
CURRENT_SCHEMA:暗许的数目库名
OBJECT_SCHEMA,OBJECT_NAME,OBJECT_TYPE:保留字段,全体为NULL
ROWS_AFFECTED:影响的数据
ROWS_SENT:重返的记录数
ROWS_EXAMINED:读取的记录数据
CREATED_TMP_DISK_TABLES:创造物理一时半刻表数目
CREATED_TMP_TABLES:创制暂且表数目
SELECT_FULL_JOIN:join时,第二个表为全表扫描的多少
SELECT_FULL_RANGE_JOIN:join时,引用表采纳range方式扫描的数据
SELECT_RANGE:join时,第三个表采纳range格局扫描的数码
SELECT_SCAN:join时,第九个表位全表扫描的多寡
SORT_ROWS:排序的记录数据
NESTING_EVENT_ID,NESTING_EVENT_TYPE,保留字段,为NULL。

Connection表
   
 Connection表记录了客户端的新闻,主要蕴涵3张表:users,hosts和account表,accounts包蕴hosts和users的音讯。
USER:用户名
HOST:用户的IP

Summary表
   
Summary表聚集了各类维度的总计新闻包蕴表维度,索引维度,会话维度,语句维度和锁维度的总结音信。
(1).wait-summary表
events_waits_summary_global_by_event_name
处境:按等待事件类型聚合,每一种事件一条记下。
events_waits_summary_by_instance
现象:按等待事件目的聚合,同一种等待事件,也许有四个实例,各样实例有两样的内部存款和储蓄器地址,由此
event_name+object_instance_begin唯壹鲜明一条记下。
events_waits_summary_by_thread_by_event_name
场所:按各样线程和事件来总结,thread_id+event_name唯1明确一条记下。
COUNT_STA汉兰达:事件计数
SUM_TIMER_WAIT:总的等待时间
MIN_TIMER_WAIT:最小等待时间
MAX_TIMER_WAIT:最大等待时间
AVG_TIMER_WAIT:平均等待时间

(2).stage-summary表
events_stages_summary_by_thread_by_event_name
events_stages_summary_global_by_event_name
与近年来类似

(3).statements-summary表
events_statements_summary_by_thread_by_event_name表和events_statements_summary_global_by_event_name表与日前类似。对于events_statements_summary_by_digest表,
FIRST_SEEN_TIMESTAMP:第七个语句推行的光阴
LAST_SEEN_TIMESTAMP:最终1个口舌实践的小运
气象:用于总括某1段时间内top SQL

(4).file I/O summary表
file_summary_by_event_name [按事件类型总计]
file_summary_by_instance [按实际文件总计]
场景:物理IO维度
FILE_NAME:具体文件名,比如:/u01/my3306/data/tcbuyer_0168/tc_biz_order_2695.ibd
EVENT_NAME:事件名,比如:wait/io/file/innodb/innodb_data_file
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计IO操作
COUNT_READ,SUM_TIMER_READ,MIN_TIMER_READ,AVG_TIMER_READ,MAX_TIMER_READ,
SUM_NUMBER_OF_BYTES_READ
统计读
COUNT_WRITE,SUM_TIMER_WRITE,MIN_TIMER_WRITE,AVG_TIMER_WRITE,MAX_TIMER_WRITE,
SUM_NUMBER_OF_BYTES_WRITE
统计写
COUNT_MISC,SUM_TIMER_MISC,MIN_TIMER_MISC,AVG_TIMER_MISC,MAX_TIMER_MISC
计算其余IO事件,比如create,delete,open,close等

(5).Table I/O and Lock Wait Summaries-表
table_io_waits_summary_by_table
基于wait/io/table/sql/handler,聚合每一个表的I/O操作,[逻辑IO]
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计IO操作
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计读
COUNT_WRITE,SUM_TIMER_WRITE,MIN_TIMER_WRITE,AVG_TIMER_WRITE,
MAX_TIMER_WRITE
统计写
COUNT_FETCH,SUM_TIMER_FETCH,MIN_TIMER_FETCH,AVG_TIMER_FETCH,
MAX_TIMER_FETCH
与读同样
COUNT_INSERT,SUM_TIMER_INSERT,MIN_TIMER_INSERT,AVG_TIMER_INSERT,MAX_TIMER_INSERT
INSERT计算,相应的还有DELETE和UPDATE计算。

(6).table_io_waits_summary_by_index_usage
与table_io_waits_summary_by_table类似,按索引维度总括

(7).table_lock_waits_summary_by_table
汇聚了表锁等待事件,包含internal lock 和 external lock。
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

(8).Connection Summaries表
events_waits_summary_by_account_by_event_name
events_waits_summary_by_user_by_event_name
events_waits_summary_by_host_by_event_name
events_stages_summary_by_account_by_event_name
events_stages_summary_by_user_by_event_name
events_stages_summary_by_host_by_event_name
events_statements_summary_by_account_by_event_name
events_statements_summary_by_user_by_event_name
events_statements_summary_by_host_by_event_name

(9).socket-summaries表
socket_summary_by_instance
socket_summary_by_event_name

其它表
performance_timers: 系统辅助的总括时间单位
threads: 监视服务端的此时此刻运维的线程

Performance-Schema(贰)
理论篇,performanceschema MySQL
Performance-Schema香港中华总商会计蕴涵56个表,首要分为几类:Setup表,Instance表,Wait
伊夫nt表,Stage Ev…

events_statements_summary_by_account_by_event_name
events_statements_summary_by_user_by_event_name
events_statements_summary_by_host_by_event_name

·OBJECT_TYPE:元数据锁子系统中应用的锁类型(类似setup_objects表中的OBJECT_TYPE列值):有效值为:GLOBAL、SCHEMA、TABLE、FUNCTION、PROCEDURE、T帕杰罗IGGE猎豹CS陆(当前未使用)、EVENT、COMMIT、USERubiconLEVEL LOCK、TABLESPACE、LOCKING SE卡宴VICE,USEPAJERO LEVEL
LOCK值表示该锁是采纳GET_LOCK()函数获取的锁。LOCKING
SERubiconVICE值表示使用锁服务得到的锁;

EVENT_NAME: transaction

(6).table_io_waits_summary_by_index_usage
与table_io_waits_summary_by_table类似,按索引维度总结

* _os:操作系统类型(例如Linux,Win6四)

* 注意:要是在server运行之后再修改memory
instruments,恐怕会导致由于丢失从前的分红操作数据而招致在出狱之后内部存款和储蓄器总计新闻出现负值,所以不建议在运作时一再按键memory
instruments,若是有内部存储器事件总计须求,建议在server运行之前就在my.cnf中配备好内需总括的轩然大波采访

Instance表
   
 instance中要害含有了五张表:cond_instances,file_instances,mutex_instances,rwlock_instances和socket_instances。
(1)cond_instances:条件等待对象实例
表中记录了系统中使用的规范变量的目的,OBJECT_INSTANCE_BEGIN为指标的内部存款和储蓄器地址。比如线程池的timer_cond实例的name为:wait/synch/cond/threadpool/timer_cond

4 rows in set (0.00 sec)

SUM _TIMER_WAIT: 0

Summary表
   
Summary表聚集了逐条维度的计算音讯包蕴表维度,索引维度,会话维度,语句维度和锁维度的总计新闻。
(1).wait-summary表
events_waits_summary_global_by_event_name
场馆:按等待事件类型聚合,各个事件一条记下。
events_waits_summary_by_instance
气象:按等待事件目的聚合,同1种等待事件,恐怕有多少个实例,每一种实例有例外的内部存款和储蓄器地址,由此
event_name+object_instance_begin唯壹鲜明一条记下。
events_waits_summary_by_thread_by_event_name
境况:按种种线程和事件来计算,thread_id+event_name唯1分明一条记下。
COUNT_STAQashqai:事件计数
SUM_TIMER_WAIT:总的等待时间
MIN_TIMER_WAIT:最小等待时间
MAX_TIMER_WAIT:最大等待时间
AVG_TIMER_WAIT:平均等待时间

|TABLE | xiaoboluo |test | 140568038528544 |0| 0 |NULL | NULL |

MIN_TIMER_WAIT: 72775000

(5).Table I/O and Lock
Wait Summaries-表
table_io_waits_summary_by_table
根据wait/io/table/sql/handler,聚合每一个表的I/O操作,[逻辑IO]
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计IO操作
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计读
COUNT_WRITE,SUM_TIMER_WRITE,MIN_TIMER_WRITE,AVG_TIMER_WRITE,
MAX_TIMER_WRITE
统计写
COUNT_FETCH,SUM_TIMER_FETCH,MIN_TIMER_FETCH,AVG_TIMER_FETCH,
MAX_TIMER_FETCH
与读一样
COUNT_INSERT,SUM_TIMER_INSERT,MIN_TIMER_INSERT,AVG_TIMER_INSERT,MAX_TIMER_INSERT
INSERT总计,相应的还有DELETE和UPDATE总括。

|admin | localhost |1| 1 |

*************************** 1. row
***************************

(5)socket_instances:活跃会话对象实例
表中著录了thread_id,socket_id,ip和port,别的表可以通过thread_id与socket_instance进行关联,获取IP-PORT消息,能够与使用接入起来。
event_name首要涵盖三类:
wait/io/socket/sql/server_unix_socket,服务端unix监听socket
wait/io/socket/sql/server_tcpip_socket,服务端tcp监听socket
wait/io/socket/sql/client_connection,客户端socket

|3| _os |linux-glibc2. 5| 0 |

1 row in set (0.00 sec)

(3).statements-summary表
events_statements_summary_by_thread_by_event_name表和events_statements_summary_global_by_event_name表与前方类似。对于events_statements_summary_by_digest表,
FIRST_SEEN_TIMESTAMP:第多少个语句执行的小运
LAST_SEEN_TIMESTAMP:最终二个言辞施行的小时
现象:用于计算某1段时间内top SQL

| Tables_in_performance_schema (%file_summary%) |

1 row in set (0.00 sec)

     MySQL
Performance-Schema中一共包括53个表,主要分为几类:Setup表,Instance表,Wait
伊芙nt表,Stage 伊夫nt表Statement
伊夫nt表,Connection表和Summary表。上1篇文章已经主要讲了Setup表,那篇小说将会独家就每个档次的表做详细的描述。

……

*
LOW_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USED:对应CURRENT_NUMBER_OF_BYTES_USED列的低和高水位标志

(2).stage-summary表
events_stages_summary_by_thread_by_event_name
events_stages_summary_global_by_event_name
与前方类似

·已呼吁但未予以的锁(显示怎么会话正在等候哪些元数据锁);

*************************** 1. row
***************************

Statement
Event表
     
Statement表主要含有一个表,events_statements_current,events_statements_history和events_statements_history_long。通过thread_id+event_id能够唯壹显著一条记下。Statments表只记录最顶层的伸手,SQL语句或是COMMAND,每条语句一行,对于嵌套的子查询恐怕存款和储蓄进度不会单独列出。event_name形式为statement/sql/*,或statement/com/*
SQL_TEXT:记录SQL语句
DIGEST:对SQL_TEXT做MD5生出的三12位字符串。若是为consumer表中并未有展开statement_digest选项,则为NULL。
DIGEST_TEXT:将讲话中值部分用问号代替,用于SQL语句归类。就算为consumer表中从不张开statement_digest选项,则为NULL。
CURRENT_SCHEMA:私下认可的多少库名
OBJECT_SCHEMA,OBJECT_NAME,OBJECT_TYPE:保留字段,全部为NULL
ROWS_AFFECTED:影响的数额
ROWS_SENT:重回的记录数
ROWS_EXAMINED:读取的笔录数据
CREATED_TMP_DISK_TABLES:创设物理一时表数目
CREATED_TMP_TABLES:创造一时半刻表数目
SELECT_FULL_JOIN:join时,第1个表为全表扫描的多少
SELECT_FULL_RANGE_JOIN:join时,引用表采纳range格局扫描的数目
SELECT_RANGE:join时,第二个表选拔range方式扫描的多寡
SELECT_SCAN:join时,第三个表位全表扫描的数目
SORT_ROWS:排序的笔录数据
NESTING_EVENT_ID,NESTING_EVENT_TYPE,保留字段,为NULL。

| wait/io/socket/sql/server_tcpip_socket |110667200| 1 |32| :: |3306|
ACTIVE |

AVG _TIMER_WAIT: 0

(2)file_instances:文件实例
表中记录了系统中开垦了文本的目的,包涵ibdata文件,redo文件,binlog文件,用户的表文件等,比如redo日志文件:/u01/my3306/data/ib_logfile0。open_count展现当前文件打开的数目,如若重来未有展开过,不会冒出在表中。

我们先来探视表中著录的总结音信是怎样子的。

HOST: localhost

external
lock则经过接口函数handler::external_lock调用存储引擎层,
OPERATION列的值为:
read external
write external

MIN_TIMER_READ: 15213375

COUNT_STAR: 1

     
 Stage表重要含有三个表,events_stages_current,events_stages_history和events_stages_history_long,通过thread_id+event_id能够唯一分明一条记下。表中著录了现阶段线程所处的推行阶段,由于可以通晓种种阶段的进行时间,由此通过stage表可以获得SQL在各种阶段消耗的小时。

SUM _TIMER_WAIT: 195829830101250

1 row in set (0.00 sec)

(3)mutex_instances:互斥同步对象实例
表中记录了系统中使用互斥量对象的有着记录,在那之中name为:wait/synch/mutex/*。比如打开文件的互斥量:wait/synch/mutex/mysys/TH昂科威_LOCK_open。LOCKED_BY_THREAD_ID显示哪个线程正持有mutex,若未有线程持有,则为NULL。

该表包涵关于内部和外部锁的新闻:

进行该语句时有如下行为:

events_stages_summary_by_account_by_event_name
events_stages_summary_by_user_by_event_name
events_stages_summary_by_host_by_event_name

* _client_version:客户端库版本

内部存款和储蓄器事件instruments中除去performance_schema自己内部存款和储蓄器分配相关的风浪instruments配置默许开启之外,其余的内存事件instruments配置都默许关闭的,且在setup_consumers表中一直不像等待事件、阶段事件、语句事件与业务事件这样的单身安顿项。

(4)rwlock_instances:
读写锁同步对象实例
表中记录了系统中应用读写锁对象的富有记录,在那之中name为
wait/synch/rwlock/*。WRITE_LOCKED_BY_THREAD_ID为正在有着该目的的thread_id,若未有线程持有,则为NULL,READ_LOCKED_BY_COUNT为记录了并且有多少个读者持有读锁。通过
events_waits_current
表能够清楚,哪个线程在伺机锁;通过rwlock_instances知道哪些线程持有锁。rwlock_instances的毛病是,只可以记录持有写锁的线程,对于读锁则无法。

·OBJECT_INSTANCE_BEGIN:mutex instruments实例的内部存款和储蓄器地址;

HOST: localhost

(7).table_lock_waits_summary_by_table
集合了表锁等待事件,包罗internal lock 和
external lock。
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

按照与table_io_waits_summary_by_table的分组列+INDEX_NAME列举行分组,INDEX_NAME有如下两种:

| events_transactions_summary_by_host_by_event_name |

其它表
performance_timers:
系统匡助的总计时间单位
threads:
监视服务端的脚下运转的线程

……

1 row in set (0.00 sec)

(4).file I/O
summary表
file_summary_by_event_name
[按事件类型总括]
file_summary_by_instance
[按实际文件总计]
场景:物理IO维度
FILE_NAME:具体文件名,比如:/u01/my3306/data/tcbuyer_0168/tc_biz_order_2695.ibd
EVENT_NAME:事件名,比如:wait/io/file/innodb/innodb_data_file
COUNT_STAR,SUM_TIMER_WAIT,MIN_TIMER_WAIT,AVG_TIMER_WAIT,MAX_TIMER_WAIT
统计IO操作
COUNT_READ,SUM_TIMER_READ,MIN_TIMER_READ,AVG_TIMER_READ,MAX_TIMER_READ,
SUM_NUMBER_OF_BYTES_READ
统计读
COUNT_WRITE,SUM_TIMER_WRITE,MIN_TIMER_WRITE,AVG_TIMER_WRITE,MAX_TIMER_WRITE,
SUM_NUMBER_OF_BYTES_WRITE
统计写
COUNT_MISC,SUM_TIMER_MISC,MIN_TIMER_MISC,AVG_TIMER_MISC,MAX_TIMER_MISC
总计别的IO事件,比如create,delete,open,close等

metadata_locks表字段含义如下:

COUNT_STAR: 3

THREAD_ID:线程ID
EVENT_ID:事件ID
END_EVENT_ID:刚停止的事件ID
SOU大切诺基CE:源码地点
TIMER_START, TIMER_END,
TIMER_WAIT:事件初始/甘休和等待的光阴,单位为皮秒(picoseconds)
NESTING_EVENT_ID:该事件对应的父事件ID
NESTING_EVENT_TYPE:父事件类型(STATEMENT,
STAGE, WAIT)

咱俩先来探望表中记录的总括消息是如何体统的。

EVENT_NAME: stage/sql/After create

Stage Event表 

*************************** 1. row
***************************

+——————————————————–+

OBJECT_SCHEMA, OBJECT_NAME,
OBJECT_TYPE视情况而定
对此联合对象(cond, mutex,
rwlock),这么些2个值均为NULL
对于文本IO对象,OBJECT_SCHEMA为NULL,OBJECT_NAME为文件名,OBJECT_TYPE为FILE
对于SOCKET对象,OBJECT_NAME为该socket的IP:SOCK值
对于表I/O对象,OBJECT_SCHEMA是表的SCHEMA名,OBJECT_NAME是表名,OBJECT_TYPE为TABLE或者TEMPORARY
TABLE
NESTING_EVENT_ID:该事件对应的父事件ID
NESTING_EVENT_TYPE:父事件类型(STATEMENT,
STAGE, WAIT)
OPERATION:操作类型(lock, read,
write)

| OBJECT_TYPE |OBJECT_SCHEMA | OBJECT_NAME |OBJECT_INSTANCE_BEGIN |
OWNER_THREAD_ID |OWNER_EVENT_ID | INTERNAL_LOCK |EXTERNAL_LOCK |

* COUNT_ALLOC:增加1

Wait Event表
     
Wait表主要含有3个表,events_waits_current,events_waits_history和events_waits_history_long,通过thread_id+event_id能够唯壹分明一条记下。current表记录了当下线程等待的事件,history表记录了各样线程目前拭目以待的11个事件,而history_long表则记录了近年拥无线程暴发的一千0个事件,那里的拾和一千0都以足以安顿的。这四个表表结构同样,history和history_long表数据都源于current表。current表和history表中也许会有重新事件,并且history表中的事件都以成就了的,未有终结的事件不会加盟到history表中。
THREAD_ID:线程ID
EVENT_ID:当前线程的风浪ID,和THREAD_ID组成二个Primary
Key。
END_EVENT_ID:当事件发轫时,那1列棉被服装置为NULL。当事件甘休时,再立异为当下的轩然大波ID。
SOUENCORECE:该事件时有爆发时的源码文件
TIMER_START, TIMER_END,
TIMER_WAIT:事件始于/甘休和等候的时光,单位为阿秒(picoseconds)

…………

5rows inset ( 0. 00sec)

(8).Connection
Summaries表
events_waits_summary_by_account_by_event_name
events_waits_summary_by_user_by_event_name
events_waits_summary_by_host_by_event_name

SUM_ERRORS: 0

PS3:对这一个表使用truncate语句,影响与等待事件类似。

Connection表
   
 Connection表记录了客户端的新闻,主要不外乎三张表:users,hosts和account表,accounts包括hosts和users的消息。
USER:用户名
HOST:用户的IP

·mutex_instances:wait sync相关的Mutex对象实例;

HOST: NULL

(9).socket-summaries表
socket_summary_by_instance
socket_summary_by_event_name

OBJECT _INSTANCE_BEGIN: 139882156936704

events_statements_summary_by_account_by_event_name:依照种种帐户和讲话事件名称实行计算

通过对以下三个表实行查询,能够兑现对应用程序的监察或DBA能够检查评定到关系锁的线程之间的一些瓶颈或死锁新闻:

COUNT_STAR: 7

·STATE:套接字状态,有效值为:IDLE或ACTIVE。追踪活跃socket连接的等候时间使用相应的socket
instruments。跟着空闲socket连接的等候时间使用一个誉为idle的socket
instruments。假若3个socket正在守候来自客户端的呼吁,则该套接字此时地处空闲状态。当套接字处于空闲时,在socket_instances表中对应socket线程的音讯中的STATE列值从ACTIVE状态切换成IDLE。EVENT_NAME值保持不变,不过instruments的日子搜罗作用被中止。同时在events_waits_current表中记录EVENT_NAME列值为idle的壹行事件消息。当以此socket接收到下3个伸手时,idle事件被终止,socket
instance从闲暇状态切换成活动状态,并回复套接字连接的时光采访功用。

*
COUNT_STATEMENTS,SUM_STATEMENTS_WAIT,MIN_STATEMENTS_WAIT,AVG_STATEMENTS_WAIT,MAX_STATEMENTS_WAIT:关于存款和储蓄程序实施时期调用的嵌套语句的总计新闻

FILE_NAME: /data/mysqldata1/innodb_ts/ibdata1

*************************** 1. row
***************************

·OBJECT_TYPE:呈现handles锁的连串,表示该表是被哪些table
handles打开的;

MIN _TIMER_WAIT: 0

admin@localhost : performance_schema 06:53:42> show tables like
‘%socket%summary%’;

| events_waits_summary_global_by_event_name |

table_handles表字段含义如下:

MIN _TIMER_WAIT: 0

该表允许使用TRUNCATE
TABLE语句。只将总括列重新恢复设置为零,而不是剔除行。对该表实施truncate还会隐式truncate
table_io_waits_summary_by_index_usage表

SUM_SORT_ROWS: 170

·当监听套接字检查评定到连年时,srever将连接转移给一个由单独线程管理的新套接字。新连接线程的instruments具备client_connection的socket_type值,组成对应的instruments名称;

# 即便须求总计内部存款和储蓄器事件音信,须要展开内部存储器事件搜罗器

OPEN_COUNT:文件当前已展开句柄的计数。若是文件张开然后关门,则展开一次,但OPEN_COUNT列将加一然后减壹,因为OPEN_COUNT列只总结当前已张开的文书句柄数,已关闭的文本句柄会从中减去。要列出server中当前张开的有所文件音信,能够使用where
WHERE OPEN_COUNT> 0子句实行查看。

# events_transactions_summary_by_thread_by_event_name表

file_instances表列出实行文书I/O
instruments时performance_schema所见的富有文件。
假若磁盘上的文书未有张开,则不会在file_instances中著录。当文件从磁盘中剔除时,它也会从file_instances表中删去相应的笔录。

EVENT _NAME: wait/synch/mutex/sql/TC_LOG _MMAP::LOCK_tc

·当有着互斥体的线程释放互斥体时,mutex_instances表中对应排斥体行的THREAD_ID列被改动为NULL;

| 阶段事件总结表

| wait/synch/mutex/mysys/THR_LOCK_heap |32576832| NULL |

*************************** 1. row
***************************

SUM_ROWS_AFFECTED: 0

# memory_summary_by_host_by_event_name表

·CURRENT_CONNECTIONS:某帐号的此时此刻连接数;

SUM _SELECT_RANGE_CHECK: 0

OBJECT_TYPE: TABLE

DIGEST_TEXT: SELECT @@`version_comment` LIMIT ?

……

USER: NULL

五.prepare语句实例总结表

*
假如给定语句的总结消息行在events_statements_summary_by_digest表中一直不已存在行,且events_statements_summary_by_digest表空间限制已满的意况下,则该语句的总括音信将增加到DIGEST
列值为
NULL的奇怪“catch-all”行,即使该尤其行不设有则新插入壹行,FI昂科雷ST_SEEN和LAST_SEEN列为当前岁月。即使该越发行已存在则更新该行的音信,LAST_SEEN为近日光阴

socket_instances表不容许采纳TRUNCATE TABLE语句。

events_statements_summary_by_host_by_event_name:依据每种主机名和事件名称进行计算的Statement事件

透过对以下七个表实施查询,能够兑现对应用程序的督察或DBA能够检验到关系互斥体的线程之间的瓶颈或死锁音信(events_waits_current能够查阅到近期正在等候互斥体的线程新闻,mutex_instances能够查看到当下有个别互斥体被哪些线程持有)。

1 row in set (0.00 sec)

二. 老是属性总括表

MAX _TIMER_WAIT: 0

*
COUNT_READ,SUM_TIMER_READ,MIN_TIMER_READ,AVG_TIMER_READ,MAX_TIMER_READ,SUM_NUMBER_OF_BYTES_READ:这几个列总括了富有文件读取操作,包涵FGETS,FGETC,FREAD和READ系统调用,还包蕴了这一个I/O操作的多少字节数

COUNT_STAR: 0

hosts表包涵客户端连接到MySQL
server的主机音讯,一个主机名对应1行记录,该表针对主机作为唯1标识举办总括当前连接数和总连接数。server运行时,表的轻重会活动调整。
要显式设置该表大小,能够在server运维此前安装系统变量performance_schema_hosts_size的值。假诺该变量设置为0,则象征禁止使用hosts表总结新闻。

5rows inset ( 0. 00sec)

AVG _TIMER_WAIT: 56688392

SUM _TIMER_WAIT: 0

*************************** 1. row
***************************

SUM _NUMBER_OF _BYTES_FREE: 3296

·DEALLOCATE PREPARE步骤:语法 {DEALLOCATE | DROP} PREPARE
stmt_name,示例:drop prepare stmt;
,此时在prepared_statements_instances表中对应的prepare示例记录自动删除。

内部存款和储蓄器行为监察和控制装置:

admin@localhost : performance _schema 10:50:38> select * from
prepared_statements_instancesG;

root@localhost : performance _schema 11:08:05> select * from
events_waits _summary_by_instance limit 1G

OBJECT_NAME: test

| events_statements_summary_by_thread_by_event_name |

01

1 row in set (0.00 sec)

SUM _NUMBER_OF _BYTES_READ: 11567104

SUM _TIMER_READ_ONLY: 57571000

·LOCK_STATUS:元数据锁子系统的锁状态。有效值为:PENDING、GRANTED、VICTIM、TIMEOUT、KILLED、PRE_ACQUIRE_NOTIFY、POST_RELEASE_NOTIFY。performance_schema依照差别的阶段更换锁状态为这个值;

MIN _TIMER_WAIT: 0

2rows inset ( 0. 00sec)

SUM_NO_INDEX_USED: 42

·OBJECT_NAME:instruments对象的称谓,表等级对象;

admin@localhost : performance_schema 06:28:48> show tables like
‘%prepare%’;

# file_summary_by_instance表

| 事务事件总结表

COUNT_STAR: 56

performance_schema把等待事件总计表依照分裂的分组列(不一样纬度)对等候事件有关的数量开展联谊(聚合总计数据列包涵:事件时有产生次数,总等待时间,最小、最大、平均等待时间),注意:等待事件的募集成效有部分默许是禁止使用的,要求的时候能够透过setup_instruments和setup_objects表动态开启,等待事件总计表包罗如下几张表:

· OWNER_THREAD_ID:持有该handles锁的线程ID;

关于内部存款和储蓄器事件的表现监督装置与注意事项

·table_handles:表锁的富有和呼吁记录。

……

metadata_locks表不相同意使用TRUNCATE TABLE语句。

当server中的某线程推行了内部存款和储蓄器分配操作时,根据如下规则进行检验与聚集:

# file_summary_by_event_name表

SUM _CREATED_TMP _DISK_TABLES: 3

·EVENT_NAME:与公事相关联的instruments名称;

| Tables_in_performance_schema (%events_statements_summary%) |

MAX _TIMER_READ: 56688392

root@localhost : performance _schema 11:53:24> select * from
memory_summary _by_account _by_event _name where COUNT_ALLOC!=0
limit 1G

mutex_instances表列出了server实行mutex
instruments时performance_schema所见的有所互斥量。互斥是在代码中应用的一种共同机制,以强制在加以时间内唯有二个线程能够访问1些公共能源。能够感到mutex爱戴着那几个公共能源不被四意抢占。

1 row in set (0.00 sec)

MAX_TIMER_READ_NORMAL: 0

MIN _TIMER_READ_WRITE: 87193000

·对此已接受的连日,performance_schema根据performance_schema_session_connect_attrs_size系统变量的值检查计算连接属性大小。借使属性大小当先此值,则会进行以下操作:

SUM _TIMER_READ_WRITE: 8592136000

·不少MySQL客户端程序设置的属性值与客户端名称相等的二个program_name属性。例如:mysqladmin和mysqldump分别将program_name连接属性设置为mysqladmin和mysqldump,其它一些MySQL客户端程序还定义了附加属性:

performance_schema把工作事件总计表也如约与等待事件计算表类似的规则进行分类总结,事务事件instruments唯有二个transaction,暗中同意禁止使用,事务事件计算表有如下几张表:

·当呼吁元数据锁无法及时收获时,将插入状态为PENDING的锁音信行;

1 row in set (0.00 sec)

依据数据库对象名称(库品级对象和表等第对象,如:库名和表名)实行总结的守候事件。根据OBJECT_TYPE、OBJECT_SCHEMA、OBJECT_NAME列实行分组,依照COUNT_STAR、xxx_TIMER_WAIT字段举行总括。包涵一张objects_summary_global_by_type表。

从地方表中的言传身教记录音讯中,大家得以看出:

(1) session_account_connect_attrs表

+——————————————————-+

当客户端连接到MySQL
server时,它的用户名和主机名都是特定的。performance_schema依据帐号、主机、用户名对那个连接的总计消息进行归类并保留到各类分类的连年音讯表中,如下:

1 row in set (0.00 sec)

大家先来看望表中著录的总计音讯是怎样子的。

| events_transactions_summary_by_thread_by_event_name |

·当线程成功锁定(持有)互斥体时:

events_statements_summary_by_user_by_event_name:依照每一个用户名和事件名称进行计算的Statement事件

文件I/O事件总括表只记录等待事件中的IO事件(不分包table和socket子类别),文件I/O事件instruments私下认可开启,在setup_consumers表中无具体的附和配置。它富含如下两张表:

AVG _TIMER_WAIT: 0

admin@localhost : performance_schema 11:05:51> select * from
session_connect_attrs;

*************************** 1. row
***************************

·OBJECT_SCHEMA:该锁来自于哪个库级其余对象;

USER: root

3rows inset ( 0. 00sec)

# events_statements_summary_by_user_by_event_name表

STATEMENT_ID: 1

| memory_summary_global_by_event_name |

·socket_summary_by_event_name:针对各类socket I/O
instruments,这几个socket操作相关的操作次数、时间和发送接收字节消息由wait/io/socket/*
instruments产生(那里的socket是指的脚下活蹦乱跳的总是成立的socket实例)

# memory_summary_by_user_by_event_name表

AVG_TIMER_EXECUTE: 0

root@localhost : performance _schema 11:56:02> select * from
memory_summary _global_by _event_name where COUNT_ALLOC!=0 limit
1G

MySQL允许应用程序引进新的一连属性,不过以下划线(_)伊始的习性名称保留供内部使用,应用程序不要创制这种格式的接连属性。以确定保证内部的连接属性不会与应用程序创立的一连属性相争论。

1 row in set (0.00 sec)

套接字计算表允许使用TRUNCATE
TABLE语句(除events_statements_summary_by_digest之外),只将总计列重新载入参数为零,而不是删除行。

……

·OBJECT_INSTANCE_BEGIN:instruments对象的内部存款和储蓄器地址;

SUM _SELECT_FULL _RANGE_JOIN: 0

(3)hosts表

# events_statements_summary_by_thread_by_event_name表

·
COUNT_REPREPARE:该行音讯对应的prepare语句在中间被重新编译的次数,重新编写翻译prepare语句之后,此前的连锁总括新闻就不可用了,因为这么些总括音信是作为言语实行的一有个别被集结到表中的,而不是独立维护的。

COUNT_FREE: 103

COUNT_STAR: 802

SUM_ROWS_AFFECTED: 0

·SOUPAJEROCE:源文件的名目,个中带有生成事件消息的检查评定代码行号;

1 row in set (0.00 sec)

| HOST |CURRENT_CONNECTIONS | TOTAL_CONNECTIONS |

*
内存instruments在setup_instruments表中持有memory/code_area/instrument_name格式的名目。但暗中同意景况下大许多instruments都被剥夺了,暗许只开启了memory/performance_schema/*开头的instruments

SUM _NUMBER_OF _BYTES_READ: 0

MIN _TIMER_WAIT: 0

COUNT_EXECUTE: 0

+————————————————————+

·USE昂Cora:有些连接的用户名,要是是叁个里头线程创设的连接,或许是心有余而力不足验证的用户创造的再三再四,则该字段为NULL;

events_waits_summary_global_by_event_name表:按照EVENT_NAME列举行分组事件新闻

……

| memory_summary_by_thread_by_event_name |

root@localhost : performance _schema 04:44:00> select * from
socket_summary _by_event_nameG;

root@localhost : performance _schema 01:25:27> select * from
events_transactions _summary_by _thread_by _event_name where SUM
_TIMER_WAIT!=0G

·当已给予的锁或挂起的锁请求被杀掉时,其锁状态从GRANTED或PENDING更新为KILLED;

1 row in set (0.00 sec)

应用程序能够接纳一些键/值对转移一些延续属性,在对mysql
server创设连接时传递给server。对于C
API,使用mysql_options()和mysql_options四()函数定义属性集。其余MySQL连接器能够应用部分自定义连接属性方法。

events_statements_summary_global_by_event_name:依照各类事件名称举行计算的Statement事件

admin@localhost : performance_schema 06:50:03> show tables like
‘%table%summary%’;

root@localhost : performance _schema 11:08:36> select * from
events_waits _summary_by _user_by _event_name limit 1G

1 row in set (0.00 sec)

| events_transactions_summary_by_user_by_event_name |

*************************** 1. row
***************************

MIN _TIMER_WAIT: 0

大家先来看望表中记录的总括音讯是怎么着体统的。

root@localhost : performance _schema 01:25:13> select * from
events_transactions _summary_by _host_by _event_name where
COUNT_STAR!=0 limit 1G

SUM_TIMER_EXECUTE: 0

root@localhost : performance _schema 12:34:43> select * from
events_statements _summary_by_programG;

MAX_TIMER_EXECUTE: 0

+————————————————-+

| table_io_waits_summary_by_table |#
根据种种表举行总结的表I/O等待事件

# events_waits_summary_global_by_event_name表

SUM_LOCK_TIME: 0

*************************** 1. row
***************************

users表包涵连接到MySQL
server的种种用户的连天音讯,每种用户壹行。该表将对准用户名作为唯1标志实行计算当前连接数和总连接数,server运营时,表的尺寸会自动调控。
要显式设置该表大小,能够在server运营在此之前设置系统变量performance_schema_users_size的值。该变量设置为0时表示禁止使用users总计新闻。

AVG _TIMER_WAIT: 0

从客户端发送到服务器的连天属性数据量存在限制:客户端在连年以前客户端有多个团结的原则性长度限制(不可配置)、在客户端连接server时服务端也有二个永远长度限制、以及在客户端连接server时的接连属性值在存入performance_schema中时也有1个可配置的尺寸限制。

MIN _TIMER_WAIT: 0

该表允许使用TRUNCATE TABLE语句。只将计算列重新载入参数为零,而不是去除行。

……

注意:rwlock_instances表中的新闻只好查看到具备写锁的线程ID,不过不可能查看到全部读锁的线程ID,因为写锁WRubiconITE_LOCKED_BY_THREAD_ID字段记录的是线程ID,读锁唯有多个READ_LOCKED_BY_COUNT字段来记录读锁被有些个线程持有。

performance_schema把内存事件总结表也遵从与等待事件统计表类似的规则实行归类总结。

(3)mutex_instances表

SUM_ROWS_EXAMINED: 39718

OWNER_OBJECT_TYPE: NULL

HOST: NULL

EVENT_NAME: wait/io/socket/sql/client_connection

Rows matched: 377 Changed: 377 Warnings: 0

+————————————————+

下一篇将为大家分享
《数据库对象事件计算与性情计算 | performance_schema全方位介绍》
,多谢您的翻阅,大家不见不散!回到天涯论坛,查看越多

+—————————————-+———————–+———–+———–+——————–+——-+——–+

EVENT_NAME: memory/innodb/fil0fil

| Tables_in_performance_schema (%socket%summary%) |

内部存款和储蓄器事件总计表有如下几张表:

AVG_TIMER_READ_NORMAL: 0

从地点表中的以身作则记录消息中,我们能够见见,同样与等待事件类似,依据用户、主机、用户+主机、线程等纬度实行分组与总括的列,那几个列的含义与等待事件类似,那里不再赘言,但对此事情总括事件,针对读写事务和只读事务还单身做了总括(xx_READ_WRITE和xx_READ_ONLY列,只读事务须求安装只读事务变量transaction_read_only=on才会议及展览开计算)。

·OBJECT_INSTANCE_BEGIN:prepare语句事件的instruments
实例内部存款和储蓄器地址。

COUNT_STAR: 11

原标题:数据库对象事件与质量计算 | performance_schema全方位介绍(伍)

我们先来探视这么些表中记录的总括音讯是怎么着体统的。

OWNER_OBJECT_SCHEMA: NULL

EVENT_NAME: memory/innodb/fil0fil

·PHP定义的性质正视于编写翻译的习性:

原标题:事件总计 | performance_schema全方位介绍(肆)

OBJECT_NAME: test

EVENT_NAME: wait/synch/mutex/mysys/THR_LOCK_heap

1row inset ( 0. 00sec)

# memory_summary_by_thread_by_event_name表

该表允许利用TRUNCATE
TABLE语句。只将总括列复位为零,而不是去除行。该表实践truncate时也会隐式触发table_io_waits_summary_by_table表的truncate操作。此外利用DDL语句改动索引结构时,会产生该表的持有索引总计音信被复位

当某给定对象被实行时,其对应的总括消息将记录在events_statements_summary_by_program表中并张开总计。

+——-+———————+——————-+

EVENT _NAME: wait/synch/mutex/sql/TC_LOG _MMAP::LOCK_tc

·外表锁对应存款和储蓄引擎层中的锁。通过调用handler::external_lock()函数来促成。(官方手册上说有3个OPERATION列来分别锁类型,该列有效值为:read
external、write external。但在该表的定义上并未见到该字段)

AVG _TIMER_WAIT: 0

*************************** 1. row
***************************

EVENT_NAME: stage/sql/After create

·假若运用到了目录,则那里显示索引的名字,假使为P路虎极光IMABMWX5Y,则象征表I/O使用到了主键索引

在上一篇《事件记录 |
performance_schema全方位介绍”》中,大家详细介绍了performance_schema的轩然大波记录表,恭喜大家在读书performance_schema的中途度过了三个最勤奋的暂且。未来,相信大家已经比较清楚什么是事件了,但有时候大家不须要领会每时每刻发生的每一条事件记录音信,
例如:大家盼望领会数据库运维以来壹段时间的轩然大波总括数据,这年就须要查阅事件总计表了。明天将教导我们一块踏上聚讼纷繁第伍篇的征途(全系共7个篇章),在那壹期里,我们将为大家无微不至授课performance_schema中事件计算表。计算事件表分为两个种类,分别为等候事件、阶段事件、语句事件、事务事件、内部存款和储蓄器事件。上面,请随行我们一起起来performance_schema系统的就学之旅吧。

mutex_instances.LOCKED_BY_THREAD_ID和rwlock_instances.WRITE_LOCKED_BY_THREAD_ID列对于排查质量瓶颈或死锁难题至关主要。

root@localhost : performance _schema 01:27:32> select * from
events_transactions _summary_global _by_event _name where
SUM_TIMER_WAIT!=0G

AVG _TIMER_READ _WITH_SHARED_LOCKS: 0

*
HIGH_COUNT_USED:如果CURRENT_COUNT_USED扩大一是1个新的最高值,则该字段值相应增加

hosts表字段含义如下:

EVENT_NAME: statement/sql/select

·hosts:依据host名称对各样客户端连接进行总括;

events_waits_summary_by_user_by_event_name表:按照列EVENT_NAME、USE君越进行分组事件音信

SQL_TEXT: SELECT 1

*************************** 1. row
***************************

admin@localhost : performance _schema 01:57:20> select * from
table_lock _waits_summary _by_table where SUM _TIMER_WAIT!=0G;

root@localhost : performance _schema 10:37:27> select * from
events_statements _summary_by _account_by _event_name where
COUNT_STAR!=0 limit 1G

cond_instances表列出了server施行condition instruments
时performance_schema所见的保有condition,condition表示在代码中一定事件时有产生时的二只模拟信号机制,使得等待该原则的线程在该condition满足条件时得以苏醒职业。

AVG_TIMER_WAIT:给定计时事件的平均等待时间

SUM_WARNINGS: 0

| 等待事件总括表

1row inset ( 0. 00sec)

1 row in set (0.00 sec)

OBJECT_TYPE: TABLE

| Tables_in_performance_schema (%memory%summary%) |

·session_account_connect_attrs:记录当前对话及其相关联的其余会话的连日属性;

1 row in set (0.00 sec)

OBJECT _INSTANCE_BEGIN: 140568048055488

SUM _TIMER_WAIT: 0

+——-+———————+——————-+

检查评定内部存款和储蓄器工作负荷峰值、内部存款和储蓄器总体的劳作负荷稳固性、大概的内部存款和储蓄器泄漏等是首要的。

14 rows inset (0.01 sec)

*
CURRENT_COUNT_USED:那是一个便捷列,等于COUNT_ALLOC – COUNT_FREE

·prepare语句预编写翻译:COM_STMT_PREPARE或SQLCOM_PREPARE命令在server中开创3个prepare语句。要是语句检查评定成功,则会在prepared_statements_instances表中新扩充加壹行。倘若prepare语句不可能检查评定,则会扩展Performance_schema_prepared_statements_lost状态变量的值。

MAX _TIMER_WAIT: 0

3rows inset ( 0. 00sec)

*************************** 1. row
***************************

* mysqlbinlog定义了_client_role属性,值为binary_log_listener

SUM_WARNINGS: 0

| 4 |_client_name | libmysql |1|

CURRENT_COUNT_USED: 0

……

| Tables_in_performance_schema (%events_transactions_summary%) |

rwlock_instances表字段含义如下:

……

+———————————-+———————–+

+————————————————————+

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website