25.1 Performance Schema Quick Start

This section briefly introduces the Performance Schema with examples that show how to use it. For additional examples, see *note performance-schema-examples::.

The Performance Schema is enabled by default. To enable or disable it explicitly, start the server with the 'performance_schema' variable set to an appropriate value. For example, use these lines in the server 'my.cnf' file:

 [mysqld]
 performance_schema=ON

When the server starts, it sees 'performance_schema' and attempts to initialize the Performance Schema. To verify successful initialization, use this statement:

 mysql> SHOW VARIABLES LIKE 'performance_schema';
 +--------------------+-------+
 | Variable_name      | Value |
 +--------------------+-------+
 | performance_schema | ON    |
 +--------------------+-------+

A value of 'ON' means that the Performance Schema initialized successfully and is ready for use. A value of 'OFF' means that some error occurred. Check the server error log for information about what went wrong.

The Performance Schema is implemented as a storage engine. If this engine is available (which you should already have checked earlier), you should see it listed with a 'SUPPORT' value of 'YES' in the output from the Information Schema note 'ENGINES': information-schema-engines-table. table or the note 'SHOW ENGINES': show-engines. statement:

 mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES
        WHERE ENGINE='PERFORMANCE_SCHEMA'\G
 *************************** 1. row ***************************
       ENGINE: PERFORMANCE_SCHEMA
      SUPPORT: YES
      COMMENT: Performance Schema
 TRANSACTIONS: NO
           XA: NO
   SAVEPOINTS: NO

 mysql> SHOW ENGINES\G
 ...
       Engine: PERFORMANCE_SCHEMA
      Support: YES
      Comment: Performance Schema
 Transactions: NO
           XA: NO
   Savepoints: NO
 ...

The *note 'PERFORMANCE_SCHEMA': performance-schema. storage engine operates on tables in the 'performance_schema' database. You can make 'performance_schema' the default database so that references to its tables need not be qualified with the database name:

 mysql> USE performance_schema;

Performance Schema tables are stored in the 'performance_schema' database. Information about the structure of this database and its tables can be obtained, as for any other database, by selecting from the 'INFORMATION_SCHEMA' database or by using *note 'SHOW': show. statements. For example, use either of these statements to see what Performance Schema tables exist:

 mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'performance_schema';
 +------------------------------------------------------+
 | TABLE_NAME                                           |
 +------------------------------------------------------+
 | accounts                                             |
 | cond_instances                                       |
 ...
 | events_stages_current                                |
 | events_stages_history                                |
 | events_stages_history_long                           |
 | events_stages_summary_by_account_by_event_name       |
 | events_stages_summary_by_host_by_event_name          |
 | events_stages_summary_by_thread_by_event_name        |
 | events_stages_summary_by_user_by_event_name          |
 | events_stages_summary_global_by_event_name           |
 | events_statements_current                            |
 | events_statements_history                            |
 | events_statements_history_long                       |
 ...
 | file_instances                                       |
 | file_summary_by_event_name                           |
 | file_summary_by_instance                             |
 | host_cache                                           |
 | hosts                                                |
 | memory_summary_by_account_by_event_name              |
 | memory_summary_by_host_by_event_name                 |
 | memory_summary_by_thread_by_event_name               |
 | memory_summary_by_user_by_event_name                 |
 | memory_summary_global_by_event_name                  |
 | metadata_locks                                       |
 | mutex_instances                                      |
 | objects_summary_global_by_type                       |
 | performance_timers                                   |
 | replication_connection_configuration                 |
 | replication_connection_status                        |
 | replication_applier_configuration                    |
 | replication_applier_status                           |
 | replication_applier_status_by_coordinator            |
 | replication_applier_status_by_worker                 |
 | rwlock_instances                                     |
 | session_account_connect_attrs                        |
 | session_connect_attrs                                |
 | setup_actors                                         |
 | setup_consumers                                      |
 | setup_instruments                                    |
 | setup_objects                                        |
 | setup_timers                                         |
 | socket_instances                                     |
 | socket_summary_by_event_name                         |
 | socket_summary_by_instance                           |
 | table_handles                                        |
 | table_io_waits_summary_by_index_usage                |
 | table_io_waits_summary_by_table                      |
 | table_lock_waits_summary_by_table                    |
 | threads                                              |
 | users                                                |
 +------------------------------------------------------+

 mysql> SHOW TABLES FROM performance_schema;
 +------------------------------------------------------+
 | Tables_in_performance_schema                         |
 +------------------------------------------------------+
 | accounts                                             |
 | cond_instances                                       |
 | events_stages_current                                |
 | events_stages_history                                |
 | events_stages_history_long                           |
 ...

The number of Performance Schema tables increases over time as implementation of additional instrumentation proceeds.

The name of the 'performance_schema' database is lowercase, as are the names of tables within it. Queries should specify the names in lowercase.

To see the structure of individual tables, use *note 'SHOW CREATE TABLE': show-create-table.:

 mysql> SHOW CREATE TABLE performance_schema.setup_consumers\G
 *************************** 1. row ***************************
        Table: setup_consumers
 Create Table: CREATE TABLE `setup_consumers` (
   `NAME` varchar(64) NOT NULL,
   `ENABLED` enum('YES','NO') NOT NULL
 ) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8

Table structure is also available by selecting from tables such as note 'INFORMATION_SCHEMA.COLUMNS': information-schema-columns-table. or by using statements such as note 'SHOW COLUMNS': show-columns.

Tables in the 'performance_schema' database can be grouped according to the type of information in them: Current events, event histories and summaries, object instances, and setup (configuration) information. The following examples illustrate a few uses for these tables. For detailed information about the tables in each group, see *note performance-schema-table-descriptions::.

Initially, not all instruments and consumers are enabled, so the performance schema does not collect all events. To turn all of these on and enable event timing, execute two statements (the row counts may differ depending on MySQL version):

 mysql> UPDATE performance_schema.setup_instruments
        SET ENABLED = 'YES', TIMED = 'YES';
 Query OK, 560 rows affected (0.04 sec)
 mysql> UPDATE performance_schema.setup_consumers
        SET ENABLED = 'YES';
 Query OK, 10 rows affected (0.00 sec)

To see what the server is doing at the moment, examine the *note 'events_waits_current': performance-schema-events-waits-current-table. table. It contains one row per thread showing each thread's most recent monitored event:

 mysql> SELECT *
        FROM performance_schema.events_waits_current\G
 *************************** 1. row ***************************
             THREAD_ID: 0
              EVENT_ID: 5523
          END_EVENT_ID: 5523
            EVENT_NAME: wait/synch/mutex/mysys/THR_LOCK::mutex
                SOURCE: thr_lock.c:525
           TIMER_START: 201660494489586
             TIMER_END: 201660494576112
            TIMER_WAIT: 86526
                 SPINS: NULL
         OBJECT_SCHEMA: NULL
           OBJECT_NAME: NULL
            INDEX_NAME: NULL
           OBJECT_TYPE: NULL
 OBJECT_INSTANCE_BEGIN: 142270668
      NESTING_EVENT_ID: NULL
    NESTING_EVENT_TYPE: NULL
             OPERATION: lock
       NUMBER_OF_BYTES: NULL
                 FLAGS: 0
 ...

This event indicates that thread 0 was waiting for 86,526 picoseconds to acquire a lock on 'THR_LOCK::mutex', a mutex in the 'mysys' subsystem. The first few columns provide the following information:

The history tables contain the same kind of rows as the current-events table but have more rows and show what the server has been doing 'recently' rather than 'currently.' The note 'events_waits_history': performance-schema-events-waits-history-table. and note 'events_waits_history_long': performance-schema-events-waits-history-long-table. tables contain the most recent 10 events per thread and most recent 10,000 events, respectively. For example, to see information for recent events produced by thread 13, do this:

 mysql> SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
        FROM performance_schema.events_waits_history
        WHERE THREAD_ID = 13
        ORDER BY EVENT_ID;
 +----------+-----------------------------------------+------------+
 | EVENT_ID | EVENT_NAME                              | TIMER_WAIT |
 +----------+-----------------------------------------+------------+
 |       86 | wait/synch/mutex/mysys/THR_LOCK::mutex  |     686322 |
 |       87 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     320535 |
 |       88 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     339390 |
 |       89 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     377100 |
 |       90 | wait/synch/mutex/sql/LOCK_plugin        |     614673 |
 |       91 | wait/synch/mutex/sql/LOCK_open          |     659925 |
 |       92 | wait/synch/mutex/sql/THD::LOCK_thd_data |     494001 |
 |       93 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     222489 |
 |       94 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     214947 |
 |       95 | wait/synch/mutex/mysys/LOCK_alarm       |     312993 |
 +----------+-----------------------------------------+------------+

As new events are added to a history table, older events are discarded if the table is full.

Summary tables provide aggregated information for all events over time. The tables in this group summarize event data in different ways. To see which instruments have been executed the most times or have taken the most wait time, sort the note 'events_waits_summary_global_by_event_name': performance-schema-wait-summary-tables. table on the 'COUNT_STAR' or 'SUM_TIMER_WAIT' column, which correspond to a 'COUNT()' or 'SUM(TIMER_WAIT)' value, respectively, calculated over all events:

 mysql> SELECT EVENT_NAME, COUNT_STAR
        FROM performance_schema.events_waits_summary_global_by_event_name
        ORDER BY COUNT_STAR DESC LIMIT 10;
 +---------------------------------------------------+------------+
 | EVENT_NAME                                        | COUNT_STAR |
 +---------------------------------------------------+------------+
 | wait/synch/mutex/mysys/THR_LOCK_malloc            |       6419 |
 | wait/io/file/sql/FRM                              |        452 |
 | wait/synch/mutex/sql/LOCK_plugin                  |        337 |
 | wait/synch/mutex/mysys/THR_LOCK_open              |        187 |
 | wait/synch/mutex/mysys/LOCK_alarm                 |        147 |
 | wait/synch/mutex/sql/THD::LOCK_thd_data           |        115 |
 | wait/io/file/myisam/kfile                         |        102 |
 | wait/synch/mutex/sql/LOCK_global_system_variables |         89 |
 | wait/synch/mutex/mysys/THR_LOCK::mutex            |         89 |
 | wait/synch/mutex/sql/LOCK_open                    |         88 |
 +---------------------------------------------------+------------+

 mysql> SELECT EVENT_NAME, SUM_TIMER_WAIT
        FROM performance_schema.events_waits_summary_global_by_event_name
        ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
 +----------------------------------------+----------------+
 | EVENT_NAME                             | SUM_TIMER_WAIT |
 +----------------------------------------+----------------+
 | wait/io/file/sql/MYSQL_LOG             |     1599816582 |
 | wait/synch/mutex/mysys/THR_LOCK_malloc |     1530083250 |
 | wait/io/file/sql/binlog_index          |     1385291934 |
 | wait/io/file/sql/FRM                   |     1292823243 |
 | wait/io/file/myisam/kfile              |      411193611 |
 | wait/io/file/myisam/dfile              |      322401645 |
 | wait/synch/mutex/mysys/LOCK_alarm      |      145126935 |
 | wait/io/file/sql/casetest              |      104324715 |
 | wait/synch/mutex/sql/LOCK_plugin       |       86027823 |
 | wait/io/file/sql/pid                   |       72591750 |
 +----------------------------------------+----------------+

These results show that the 'THR_LOCK_malloc' mutex is 'hot,' both in terms of how often it is used and amount of time that threads wait attempting to acquire it.

Note:

The 'THR_LOCK_malloc' mutex is used only in debug builds. In production builds it is not hot because it is nonexistent.

Instance tables document what types of objects are instrumented. An instrumented object, when used by the server, produces an event. These tables provide event names and explanatory notes or status information. For example, the *note 'file_instances': performance-schema-file-instances-table. table lists instances of instruments for file I/O operations and their associated files:

 mysql> SELECT *
        FROM performance_schema.file_instances\G
 *************************** 1. row ***************************
  FILE_NAME: /opt/mysql-log/60500/binlog.000007
 EVENT_NAME: wait/io/file/sql/binlog
 OPEN_COUNT: 0
 *************************** 2. row ***************************
  FILE_NAME: /opt/mysql/60500/data/mysql/tables_priv.MYI
 EVENT_NAME: wait/io/file/myisam/kfile
 OPEN_COUNT: 1
 *************************** 3. row ***************************
  FILE_NAME: /opt/mysql/60500/data/mysql/columns_priv.MYI
 EVENT_NAME: wait/io/file/myisam/kfile
 OPEN_COUNT: 1
 ...

Setup tables are used to configure and display monitoring characteristics. For example, *note 'setup_instruments': performance-schema-setup-instruments-table. lists the set of instruments for which events can be collected and shows which of them are enabled:

 mysql> SELECT * FROM performance_schema.setup_instruments;
 +---------------------------------------------------+---------+-------+
 | NAME                                              | ENABLED | TIMED |
 +---------------------------------------------------+---------+-------+
 ...
 | stage/sql/end                                     | NO      | NO    |
 | stage/sql/executing                               | NO      | NO    |
 | stage/sql/init                                    | NO      | NO    |
 | stage/sql/insert                                  | NO      | NO    |
 ...
 | statement/sql/load                                | YES     | YES   |
 | statement/sql/grant                               | YES     | YES   |
 | statement/sql/check                               | YES     | YES   |
 | statement/sql/flush                               | YES     | YES   |
 ...
 | wait/synch/mutex/sql/LOCK_global_read_lock        | YES     | YES   |
 | wait/synch/mutex/sql/LOCK_global_system_variables | YES     | YES   |
 | wait/synch/mutex/sql/LOCK_lock_db                 | YES     | YES   |
 | wait/synch/mutex/sql/LOCK_manager                 | YES     | YES   |
 ...
 | wait/synch/rwlock/sql/LOCK_grant                  | YES     | YES   |
 | wait/synch/rwlock/sql/LOGGER::LOCK_logger         | YES     | YES   |
 | wait/synch/rwlock/sql/LOCK_sys_init_connect       | YES     | YES   |
 | wait/synch/rwlock/sql/LOCK_sys_init_slave         | YES     | YES   |
 ...
 | wait/io/file/sql/binlog                           | YES     | YES   |
 | wait/io/file/sql/binlog_index                     | YES     | YES   |
 | wait/io/file/sql/casetest                         | YES     | YES   |
 | wait/io/file/sql/dbopt                            | YES     | YES   |
 ...

To understand how to interpret instrument names, see *note performance-schema-instrument-naming::.

To control whether events are collected for an instrument, set its 'ENABLED' value to 'YES' or 'NO'. For example:

 mysql> UPDATE performance_schema.setup_instruments
        SET ENABLED = 'NO'
        WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';

The Performance Schema uses collected events to update tables in the 'performance_schema' database, which act as 'consumers' of event information. The *note 'setup_consumers': performance-schema-setup-consumers-table. table lists the available consumers and which are enabled:

 mysql> SELECT * FROM performance_schema.setup_consumers;
 +----------------------------------+---------+
 | NAME                             | ENABLED |
 +----------------------------------+---------+
 | events_stages_current            | NO      |
 | events_stages_history            | NO      |
 | events_stages_history_long       | NO      |
 | events_statements_current        | YES     |
 | events_statements_history        | YES     |
 | events_statements_history_long   | NO      |
 | events_transactions_current      | NO      |
 | events_transactions_history      | NO      |
 | events_transactions_history_long | NO      |
 | events_waits_current             | NO      |
 | events_waits_history             | NO      |
 | events_waits_history_long        | NO      |
 | global_instrumentation           | YES     |
 | thread_instrumentation           | YES     |
 | statements_digest                | YES     |
 +----------------------------------+---------+

To control whether the Performance Schema maintains a consumer as a destination for event information, set its 'ENABLED' value.

For more information about the setup tables and how to use them to control event collection, see *note performance-schema-filtering::.

There are some miscellaneous tables that do not fall into any of the previous groups. For example, note 'performance_timers': performance-schema-performance-timers-table. lists the available event timers and their characteristics. For information about timers, see note performance-schema-timing::.

 File: manual.info.tmp, Node: performance-schema-build-configuration, Next: performance-schema-startup-configuration, Prev: performance-schema-quick-start, Up: performance-schema