zoukankan      html  css  js  c++  java
  • MySQL Performance-Schema(二) 理论篇

         MySQL Performance-Schema中总共包含52个表,主要分为几类:Setup表,Instance表,Wait Event表,Stage Event表Statement Event表,Connection表和Summary表。上一篇文章已经着重讲了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/THR_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表主要包含3个表,events_waits_current,events_waits_history和events_waits_history_long,通过thread_id+event_id可以唯一确定一条记录。current表记录了当前线程等待的事件,history表记录了每个线程最近等待的10个事件,而history_long表则记录了最近所有线程产生的10000个事件,这里的10和10000都是可以配置的。这三个表表结构相同,history和history_long表数据都来源于current表。current表和history表中可能会有重复事件,并且history表中的事件都是完成了的,没有结束的事件不会加入到history表中。
    THREAD_ID:线程ID
    EVENT_ID:当前线程的事件ID,和THREAD_ID组成一个Primary Key。
    END_EVENT_ID:当事件开始时,这一列被设置为NULL。当事件结束时,再更新为当前的事件ID。
    SOURCE:该事件产生时的源码文件
    TIMER_START, TIMER_END, TIMER_WAIT:事件开始/结束和等待的时间,单位为皮秒(picoseconds)

    OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE视情况而定
    对于同步对象(cond, mutex, rwlock),这个3个值均为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表主要包含3个表,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
    SOURCE:源码位置
    TIMER_START, TIMER_END, TIMER_WAIT:事件开始/结束和等待的时间,单位为皮秒(picoseconds)
    NESTING_EVENT_ID:该事件对应的父事件ID
    NESTING_EVENT_TYPE:父事件类型(STATEMENT, STAGE, WAIT)

    Statement Event表
          Statement表主要包含3个表,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产生的32位字符串。如果为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唯一确定一条记录。
    COUNT_STAR:事件计数
    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:最后一个语句执行的时间
    场景:用于统计某一段时间内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: 监视服务端的当前运行的线程

  • 相关阅读:
    PAT-乙级-1011. A+B和C (15)
    PAT-乙级-1010. 一元多项式求导 (25)
    PAT-乙级-1009. *说反话 (20)
    PAT-乙级-1008. 数组元素循环右移问题 (20)
    PAT-乙级-1007. 素数对猜想 (20)
    PAT-乙级-1006. 换个格式输出整数 (15)
    PAT-乙级-1005. 继续(3n+1)猜想 (25)
    PAT-乙级-1004. 成绩排名 (20)
    BZOJ 1030: [JSOI2007]文本生成器
    BZOJ 2938: [Poi2000]病毒
  • 原文地址:https://www.cnblogs.com/cchust/p/5057498.html
Copyright © 2011-2022 走看看