您的位置:宽带测速网 > mysql教程 > Performance Schema怎么用

Performance Schema怎么用

2025-06-24 08:05来源:互联网 [ ]

Performance Schema简介

Oracle DBA都应该知道 Oracle中提供了大量的视图供DBA们排查问题使用,并且有等待事件帮助大家快速定位问题属于哪一类。MySQL 中也有Performance Schema帮助大家去分析排查问题,并且在5.7中增加了Sys Schema,将Performance Schema和information_schema的信息格式化后,供大家更方便的分析问题。


这里先介绍先Performance Schema的使用方式,便于后面大家更好的去使用Sys Schema。

Performance Schema开启方式

    设置instruments及consumers开启

    开启performance_schema=on之后我们还需要进行设置instruments及consumers


    instruments通俗讲就是监控项可以通过setup_instruments表设置需要开启对哪些项监控进行统计

    consumers就是控制是否将监控到的结果进行记录

    UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES';

    UPDATE setup_consumers SET ENABLED = 'YES';

    如果不开启instruments和consumers则相应的事件检测则不能使用,也就不能收集相应的等待事件和性能的统计。

    当然我们也可以单独设置某一个instruments的开启和关闭

    UPDATE setup_instruments SET ENABLED = 'NO'

    WHERE NAME = 'wait/io/file/sql/binlog';

    为了防止重启后恢复默认配置可以添加到配置文件中设置

    performance-schema-instrument='instrument_name=value'

    performance-schema-consumer-consumer_name=value

    instrument_name和consumer_name

    可以通过查询setup_instruments和setup_consumers;查看

    setup_consumers中的层级关系

    mysql> select * from setup_consumers;

    +--------------------------------+---------+
    | NAME| ENABLED |
    +--------------------------------+---------+
    | events_stages_current | YES |
    | events_stages_history | YES |
    | events_stages_history_long | YES |
    | events_statements_current | YES |
    | events_statements_history | YES |
    | events_statements_history_long | YES |
    | events_waits_current| YES |
    | events_waits_history| YES |
    | events_waits_history_long | YES |
    | global_instrumentation | YES |
    | thread_instrumentation | YES |
    | statements_digest | YES |
    +--------------------------------+---------+

    12 rows in set (0.00 sec)

    setup_consumers中的事件表有层级之分 ,我们可以通过上面看到有 global、thread、current、history、history_long,他们之间的层级如下:

    global_instrumentation

    thread_instrumentation
    events_waits_current
    events_waits_history
    events_waits_history_long
    events_stages_current
    events_stages_history
    events_stages_history_long
    events_statements_current
    events_statements_history
    events_statements_history_long

    statements_digest

    也就是说,如果设置了global的才会去检查thread的有没有被设置,如果thread的设置了才会去检查current的有没有被设置,如果global的没有被设置则thread和current都不去检查,相应的信息也不会记录到对应的表中。

    如果global_instrumentation没有被设置则对应的表中都不会记录任何信息。


    这里的history、history_long可以通过参数设置大小,因为是内存表,如果太大会占用很多内存。

    setup_instruments中的类型

    mysql> select name,count(*) from setup_instruments group by left(name,5);

    +---------------------------------+----------+
    | name| count(*) |
    +---------------------------------+----------+
    | idle|1 |
    | stage/sql/After create | 108 |
    | statement/sql/select| 168 |
    | wait/synch/mutex/sql/PAGE::lock | 279 |
    +---------------------------------+----------+

    4 rows in set (0.00 sec)

    我们可以看到setup_instruments中的类型有四种(5.6版本)。

    具体的解释大家可以在官网中查看:

    https://dev.mysql.com/doc/refman/5.6/en/performance-schema-instrument-naming.html

    简单使用介绍

    简单介绍几个语句用于排查SQL语句的效率

      查看哪些索引没有被使用过

      SELECT

      OBJECT_SCHEMA,
      OBJECT_NAME,
      INDEX_NAME
      FROM table_io_waits_summary_by_index_usage
      WHERE INDEX_NAME IS NOT NULL
      AND COUNT_STAR = 0
      AND OBJECT_SCHEMA <> 'mysql'

      ORDER BY OBJECT_SCHEMA,OBJECT_NAME;

      <ul class="list-paddingleft-2" font-size:16px;white-space:normal;background-color:#FFFFFF;box-sizing:border-box !important;">

        查看SQL语句在哪个阶段消耗最大

        SELECT eshl.event_name, sql_text, eshl.timer_wait/1000000000000 w_s

        FROM performance_schema.events_stages_history_long eshl
        JOIN performance_schema.events_statements_history_long esthl
        ON (eshl.nesting_event_id = esthl.event_id)

        WHERE eshl.timer_wait > 1*10000000000\G