Wow, the most detailed performance schema for MySQL tuning performance monitoring

1. Introduction of performance_schema

performance: performance

schema: Diagram (table) representation, representing a plan or theory in the form of an outline or model.

MySQL's performance schema is used to monitor the resource consumption, resource waiting, etc. of the MySQL server during a lower-level operation .

Features

1. Provides a method to check the internal execution of the server in real time when the database is running. Tables in the performance_schema database use the performance_schema storage engine. This database mainly focuses on performance-related data during database operation. Different from information_schema, information_schema mainly focuses on metadata information during server operation.

​ 2. The performance_schema monitors the internal operation of  the server by monitoring the events of the server. The event is anything done in the internal activities of the server and the corresponding time consumption  . Use this information to determine where the relevant resources in the server are consumed? In general, an event can be a function call , an operating system wait , a phase of SQL statement execution (such as a parsing or sorting phase during SQL statement execution), or an entire SQL statement or set of SQL statements. The collection of events can conveniently provide information about the synchronous invocation of resources such as disk files, table I/O, and table locks by the relevant storage engines in the server.
3. The events in the performance_schema are different from the events written to the binary log (events describing data modification) and the events of the event plan scheduler (which is a stored procedure). The events in performance_schema record the consumption, time-consuming, and execution times of certain activities performed by the server on certain resources.
4. Events in performance_schema are only recorded in the performance_schema of the local server. When the data in these tables changes, it will not be written to the binlog, nor will it be copied to other servers through the replication mechanism.
​ 5. Information recorded in tables related to currently active events, historical events and event summaries. It can provide the execution times and duration of an event. This in turn can be used to analyze activity associated with a specific thread, specific object (such as a mutex or file).
​ 6. The PERFORMANCE_SCHEMA storage engine uses the "detection points" in the server source code to collect event data. The code for the performance_schema implementation mechanism itself does not have an associated separate thread to detect, which is different from other functions (such as replication or event scheduler)
7. The collected event data is stored in a table in the performance_schema database . These tables can be queried using SELECT statements, or you can use SQL statements to update table records in the performance_schema database (such as dynamically modifying several configuration tables at the beginning of setup_* in performance_schema, but pay attention: the changes to the configuration tables will take effect immediately, which will affect Data collection)
8. The data in the performance_schema table will not be persistently stored in the disk, but will be stored in memory. Once the server restarts, the data will be lost (all data under the entire performance_schema including the configuration table)
9. The event monitoring function is available in all platforms supported by MySQL, but the timer types used to count event time overhead may be different in different platforms.

2. Introduction to performance schema

In the 5.7 version of mysql, the performance mode is enabled by default. If you want to explicitly disable it, you need to modify the configuration file. You cannot modify it directly, and an error Variable 'performance_schema' is a read only variable will be reported.

--查看performance_schema的属性
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+
1 row in set (0.01 sec)

--在配置文件中修改performance_schema的属性值,on表示开启,off表示关闭
[mysqld]
performance_schema=ON
                          
复制代码

1. Switch the database

use performance_schema; 
复制代码

2. View the information stored in the table below in the current database

mysql> show tables;
+------------------------------------------------------+
| Tables_in_performance_schema                         |
+------------------------------------------------------+
| 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          |
				......省略......
| status_by_thread                                     |
| status_by_user                                       |
| table_handles                                        |
| table_io_waits_summary_by_index_usage                |
| table_io_waits_summary_by_table                      |
| table_lock_waits_summary_by_table                    |
| threads                                              |
| user_variables_by_thread                             |
| users                                                |
| variables_by_thread                                  |
+------------------------------------------------------+
87 rows in set (0.00 sec)
复制代码

3. View the table structure when creating a table by show create table tablename

mysql> show create table setup_consumers;
+-----------------+---------------------------------------------------------------------+
| Table           | Create Table                                                   
+-----------------+---------------------------------------------------------------------+
| setup_consumers | CREATE TABLE `setup_consumers` (
  `NAME` varchar(64) NOT NULL,
  `ENABLED` enum('YES','NO') NOT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8 |
+-----------------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
复制代码

4. Two basic concepts

​ instruments: Producers are used to collect event information generated by various operations in mysql. The corresponding configuration items in the configuration table can be called monitoring and collection configuration items.

​ consumers:消费者,对应的消费者表用于存储来自instruments采集的数据,对应配置表中的配置项我们可以称为消费存储配置项。

三、performance_schema表的分类

​ performance_schema库下的表可以按照监视不同的纬度就行分组。

1、语句事件记录表

--语句事件记录表,这些表记录了语句事件信息,当前语句事件表events_statements_current、历史语句事件表events_statements_history和长语句历史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分)
mysql> show tables like '%statement%';
+----------------------------------------------------+
| Tables_in_performance_schema (%statement%)         |
+----------------------------------------------------+
| events_statements_current                          |
| events_statements_history                          |
| events_statements_history_long                     |
| events_statements_summary_by_account_by_event_name |
| events_statements_summary_by_digest                |
| events_statements_summary_by_host_by_event_name    |
| events_statements_summary_by_program               |
| events_statements_summary_by_thread_by_event_name  |
| events_statements_summary_by_user_by_event_name    |
| events_statements_summary_global_by_event_name     |
| prepared_statements_instances                      |
+----------------------------------------------------+
11 rows in set (0.00 sec)
复制代码

2、等待事件记录表

--等待事件记录表,与语句事件类型的相关记录表类似:
mysql> show tables like '%wait%';
+-----------------------------------------------+
| Tables_in_performance_schema (%wait%)         |
+-----------------------------------------------+
| events_waits_current                          |
| events_waits_history                          |
| events_waits_history_long                     |
| events_waits_summary_by_account_by_event_name |
| events_waits_summary_by_host_by_event_name    |
| events_waits_summary_by_instance              |
| events_waits_summary_by_thread_by_event_name  |
| events_waits_summary_by_user_by_event_name    |
| events_waits_summary_global_by_event_name     |
| table_io_waits_summary_by_index_usage         |
| table_io_waits_summary_by_table               |
| table_lock_waits_summary_by_table             |
+-----------------------------------------------+
12 rows in set (0.00 sec)
复制代码

3、阶段事件记录表

--阶段事件记录表,记录语句执行的阶段事件的表
mysql> show tables like '%stage%';
+------------------------------------------------+
| Tables_in_performance_schema (%stage%)         |
+------------------------------------------------+
| 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     |
+------------------------------------------------+
8 rows in set (0.00 sec)
复制代码

4、事务事件记录表

--事务事件记录表,记录事务相关的事件的表
mysql> show tables like '%transaction%';
+------------------------------------------------------+
| Tables_in_performance_schema (%transaction%)         |
+------------------------------------------------------+
| events_transactions_current                          |
| events_transactions_history                          |
| events_transactions_history_long                     |
| events_transactions_summary_by_account_by_event_name |
| events_transactions_summary_by_host_by_event_name    |
| events_transactions_summary_by_thread_by_event_name  |
| events_transactions_summary_by_user_by_event_name    |
| events_transactions_summary_global_by_event_name     |
+------------------------------------------------------+
8 rows in set (0.00 sec)
复制代码

5、监控文件系统层调用的表

--监控文件系统层调用的表
mysql> show tables like '%file%';
+---------------------------------------+
| Tables_in_performance_schema (%file%) |
+---------------------------------------+
| file_instances                        |
| file_summary_by_event_name            |
| file_summary_by_instance              |
+---------------------------------------+
3 rows in set (0.00 sec)
复制代码

6、监视内存使用的表

--监视内存使用的表
mysql> show tables like '%memory%';
+-----------------------------------------+
| Tables_in_performance_schema (%memory%) |
+-----------------------------------------+
| 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     |
+-----------------------------------------+
5 rows in set (0.00 sec)
复制代码

7、配置表

--动态对performance_schema进行配置的配置表
mysql> show tables like '%setup%';
+----------------------------------------+
| Tables_in_performance_schema (%setup%) |
+----------------------------------------+
| setup_actors                           |
| setup_consumers                        |
| setup_instruments                      |
| setup_objects                          |
| setup_timers                           |
+----------------------------------------+
5 rows in set (0.00 sec)
复制代码

四、performance_schema的简单配置与使用

​ 数据库刚刚初始化并启动时,并非所有instruments(单词意思是仪器,这儿理解为事件采集器,在采集器的配置表中每一项都有一个开关字段,或为YES,或为NO)和consumers(与采集器类似,这儿理解为保存器,也有一个对应的事件类型保存表配置项,为YES就表示对应的表保存性能数据,为NO就表示对应的表不保存性能数据)都启用了,所以默认不会收集所有的事件,可能你需要检测的事件并没有打开,需要进行设置,可以使用如下两个语句打开对应的instruments和consumers(行计数可能会因MySQL版本而异)。

1、事件的采集器配置项开关

--打开等待事件的采集器配置项开关,需要修改setup_instruments配置表中对应的采集器配置项
UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES'where name like 'wait%';

--打开等待事件的保存表配置开关,修改setup_consumers配置表中对应的配置项
UPDATE setup_consumers SET ENABLED = 'YES'where name like '%wait%';

--当配置完成之后可以查看当前server正在做什么,可以通过查询events_waits_current表来得知,该表中每个线程只包含一行数据,用于显示每个线程的最新监视事件
select * from events_waits_current\G
*************************** 1. row ***************************
            THREAD_ID: 11
             EVENT_ID: 570
         END_EVENT_ID: 570
           EVENT_NAME: wait/synch/mutex/innodb/buf_dblwr_mutex
               SOURCE: 
          TIMER_START: 4508505105239280
            TIMER_END: 4508505105270160
           TIMER_WAIT: 30880
                SPINS: NULL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
           INDEX_NAME: NULL
          OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 67918392
     NESTING_EVENT_ID: NULL
   NESTING_EVENT_TYPE: NULL
            OPERATION: lock
      NUMBER_OF_BYTES: NULL
                FLAGS: NULL
复制代码

属性说明

该信息表示线程id为11的线程正在等待buf_dblwr_mutex锁,等待事件为30880

​ id:事件来自哪个线程,事件编号是多少
​ event_name:表示检测到的具体的内容
​ source:表示这个检测代码在哪个源文件中以及行号
​ timer_start:表示该事件的开始时间
​ timer_end:表示该事件的结束时间
​ timer_wait:表示该事件总的花费时间

注意

current表中每个线程只保留一条记录,一旦线程完成工作,该表中不会再记录该线程的事件信息

2、history表:记录每个线程应该执行完成的事件信息

mysql> select thread_id,event_id,event_name,timer_wait from events_waits_history order by thread_id limit 21;
+-----------+----------+-----------------------------------------------+------------+
| thread_id | event_id | event_name                                    | timer_wait |
+-----------+----------+-----------------------------------------------+------------+
|        10 |     5571 | wait/synch/mutex/innodb/buf_pool_mutex        |     146784 |
|        10 |     5572 | wait/synch/mutex/innodb/buf_pool_mutex        |      18904 |
|        10 |     5573 | wait/synch/mutex/innodb/flush_list_mutex      |      91740 |
|        10 |     5574 | wait/synch/mutex/innodb/buf_pool_mutex        |      20016 |
|        10 |     5575 | wait/synch/mutex/innodb/buf_dblwr_mutex       |      30580 |
|        10 |     5566 | wait/synch/mutex/innodb/buf_pool_mutex        |     125656 |
|        10 |     5567 | wait/synch/mutex/innodb/buf_pool_mutex        |      19460 |
|        10 |     5568 | wait/synch/mutex/innodb/flush_list_mutex      |      76728 |
|        10 |     5569 | wait/synch/mutex/innodb/buf_pool_mutex        |      19460 |
|        10 |     5570 | wait/synch/mutex/innodb/buf_dblwr_mutex       |      38364 |
|        15 |    10030 | wait/synch/mutex/innodb/log_sys_mutex         |      20572 |
|        15 |    10029 | wait/synch/mutex/innodb/dict_sys_mutex        |      22796 |
|        15 |    10028 | wait/synch/sxlock/innodb/dict_operation_lock  |    1043056 |
|        15 |    10027 | wait/synch/mutex/innodb/row_drop_list_mutex   |     135664 |
|        15 |    10026 | wait/synch/mutex/innodb/flush_list_mutex      |     212392 |
|        15 |    10035 | wait/synch/mutex/innodb/flush_list_mutex      |     110644 |
|        15 |    10034 | wait/synch/mutex/innodb/log_flush_order_mutex |      24464 |
|        15 |    10033 | wait/synch/mutex/innodb/log_sys_mutex         |      21128 |
|        15 |    10032 | wait/synch/mutex/innodb/fil_system_mutex      |      78952 |
|        15 |    10031 | wait/synch/mutex/innodb/log_sys_write_mutex   |      20016 |
|        21 |     3361 | wait/synch/mutex/innodb/log_sys_mutex         |     131772 |
+-----------+----------+-----------------------------------------------+------------+
21 rows in set (0.00 sec)
复制代码

history表中记录每个线程应该执行完成的事件信息,但每个线程的事件信息只会记录10条,再多就会被覆盖,history_long表中记录所有线程的事件信息,但总记录数量是10000,超过就会被覆盖掉

3、summary:所有事件的汇总信息

mysql> SELECT EVENT_NAME,COUNT_STAR FROM events_waits_summary_global_by_event_name 
 ORDER BY COUNT_STAR DESC LIMIT 10;
+-----------------------------------------------+------------+
| EVENT_NAME                                    | COUNT_STAR |
+-----------------------------------------------+------------+
| wait/io/file/sql/FRM                          |       2944 |
| wait/synch/mutex/innodb/buf_pool_mutex        |       2808 |
| wait/synch/mutex/innodb/log_sys_mutex         |       2805 |
| wait/synch/mutex/innodb/flush_list_mutex      |       1871 |
| wait/synch/mutex/innodb/sync_array_mutex      |       1870 |
| wait/io/file/innodb/innodb_data_file          |       1619 |
| wait/synch/mutex/innodb/buf_dblwr_mutex       |        936 |
| wait/synch/mutex/innodb/dict_sys_mutex        |        935 |
| wait/synch/mutex/innodb/log_flush_order_mutex |        935 |
| wait/synch/mutex/innodb/fil_system_mutex      |        935 |
+-----------------------------------------------+------------+
10 rows in set (0.08 sec)
复制代码

summary表提供所有事件的汇总信息,该组中的表以不同的方式汇总事件数据(如:按用户,按主机,按线程等等)。例如:要查看哪些instruments占用最多的时间,可以通过对events_waits_summary_global_by_event_name表的COUNT_STAR或SUM_TIMER_WAIT列进行查询(这两列是对事件的记录数执行COUNT(*)、事件记录的TIMER_WAIT列执行SUM(TIMER_WAIT)统计而来)

4、instance表:记录哪些类型的对象会被检测

mysql> select * from file_instances limit 20; 
+------------------------------------------+--------------------------------------+------------+
| FILE_NAME                                     | EVENT_NAME                           | OPEN_COUNT |
+------------------------------------------+--------------------------------------+------------+
| /usr/share/mysql/english/errmsg.sys      | wait/io/file/sql/ERRMSG              |          0 |
| /usr/share/mysql/charsets/Index.xml      | wait/io/file/mysys/charset           |          0 |
| /var/lib/mysql/ibdata1                   | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/ib_logfile0               | wait/io/file/innodb/innodb_log_file  |          2 |
| /var/lib/mysql/ib_logfile1               | wait/io/file/innodb/innodb_log_file  |          2 |
| /var/lib/mysql/mysql/engine_cost.ibd     | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/mysql/gtid_executed.ibd   | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/mysql/help_category.ibd   | wait/io/file/innodb/innodb_data_file |          1 |
| /var/lib/mysql/mysql/help_keyword.ibd    | wait/io/file/innodb/innodb_data_file |          1 |
| /var/lib/mysql/mysql/help_relation.ibd   | wait/io/file/innodb/innodb_data_file |          1 |
| /var/lib/mysql/mysql/help_topic.ibd      | wait/io/file/innodb/innodb_data_file |          1 |
| /valib/mysql/mysql/innodb_index_stats.ibd| wait/io/file/innodb/innodb_data_file |          3 |
| /va/mysql/mysql/innodb_table_stats.ibd   | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/mysql/plugin.ibd          | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/mysql/server_cost.ibd     | wait/io/file/innodb/innodb_data_file |          3 |
| /var/lib/mysql/mysql/servers.ibd         | wait/io/file/innodb/innodb_data_file |          3 |
| /va/mysql/mysql/slave_master_info.ibd    | wait/io/file/innodb/innodb_data_file |          3 |
| /va/mysql/mysql/slave_relay_log_info.ibd | wait/io/file/innodb/innodb_data_file |          3 |
| lib/mysql/mysql/slave_worker_info.ibd    | wait/io/file/innodb/innodb_data_file |          3 |
| /ib/mysql/mysql/time_zone.ibd            | wait/io/file/innodb/innodb_data_file |          3 |
+------------------------------------------+--------------------------------------+------------+
20 rows in set (0.00 sec)
复制代码

instance表记录了哪些类型的对象会被检测。这些对象在被server使用时,在该表中将会产生一条事件记录,例如,file_instances表列出了文件I/O操作及其关联文件名

五、常用配置项的参数说明

1、启动选项

performance_schema_consumer_events_statements_current=TRUE
是否在mysql server启动时就开启events_statements_current表的记录功能(该表记录当前的语句事件信息),启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新setup_consumers配置表中的events_statements_current配置项,默认值为TRUE

performance_schema_consumer_events_statements_history=TRUE
与performance_schema_consumer_events_statements_current选项类似,但该选项是用于配置是否记录语句事件短历史信息,默认为TRUE

performance_schema_consumer_events_stages_history_long=FALSE
与performance_schema_consumer_events_statements_current选项类似,但该选项是用于配置是否记录语句事件长历史信息,默认为FALSE

除了statement(语句)事件之外,还支持:wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个启动项分别进行配置,但这些等待事件默认未启用,如果需要在MySQL Server启动时一同启动,则通常需要写进my.cnf配置文件中
performance_schema_consumer_global_instrumentation=TRUE
是否在MySQL Server启动时就开启全局表(如:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance等大部分的全局对象计数统计和事件汇总统计信息表 )的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新全局配置项
默认值为TRUE

performance_schema_consumer_statements_digest=TRUE
是否在MySQL Server启动时就开启events_statements_summary_by_digest 表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新digest配置项
默认值为TRUE

performance_schema_consumer_thread_instrumentation=TRUE
是否在MySQL Server启动时就开启

events_xxx_summary_by_yyy_by_event_name表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新线程配置项
默认值为TRUE

performance_schema_instrument[=name]
是否在MySQL Server启动时就启用某些采集器,由于instruments配置项多达数千个,所以该配置项支持key-value模式,还支持%号进行通配等,如下:

# [=name]可以指定为具体的Instruments名称(但是这样如果有多个需要指定的时候,就需要使用该选项多次),也可以使用通配符,可以指定instruments相同的前缀+通配符,也可以使用%代表所有的instruments

## 指定开启单个instruments

--performance-schema-instrument= 'instrument_name=value'

## 使用通配符指定开启多个instruments

--performance-schema-instrument= 'wait/synch/cond/%=COUNTED'

## 开关所有的instruments

--performance-schema-instrument= '%=ON'

--performance-schema-instrument= '%=OFF'
复制代码

注意

这些启动选项要生效的前提是,需要设置performance_schema=ON。另外,这些启动选项虽然无法使用show variables语句查看,但我们可以通过setup_instruments和setup_consumers表查询这些选项指定的值。

2、系统变量

show variables like '%performance_schema%';
--重要的属性解释
performance_schema=ON
/*
控制performance_schema功能的开关,要使用MySQL的performance_schema,需要在mysqld启动时启用,以启用事件收集功能
该参数在5.7.x之前支持performance_schema的版本中默认关闭,5.7.x版本开始默认开启
注意:如果mysqld在初始化performance_schema时发现无法分配任何相关的内部缓冲区,则performance_schema将自动禁用,并将performance_schema设置为OFF
*/

performance_schema_digests_size=10000
/*
控制events_statements_summary_by_digest表中的最大行数。如果产生的语句摘要信息超过此最大值,便无法继续存入该表,此时performance_schema会增加状态变量
*/
performance_schema_events_statements_history_long_size=10000
/*
控制events_statements_history_long表中的最大行数,该参数控制所有会话在events_statements_history_long表中能够存放的总事件记录数,超过这个限制之后,最早的记录将被覆盖
全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10000,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10000 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10000
*/
performance_schema_events_statements_history_size=10
/*
控制events_statements_history表中单个线程(会话)的最大行数,该参数控制单个会话在events_statements_history表中能够存放的事件记录数,超过这个限制之后,单个会话最早的记录将被覆盖
全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10
除了statement(语句)事件之外,wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个参数分别进行存储限制配置,有兴趣的同学自行研究,这里不再赘述
*/
performance_schema_max_digest_length=1024
/*
用于控制标准化形式的SQL语句文本在存入performance_schema时的限制长度,该变量与max_digest_length变量相关(max_digest_length变量含义请自行查阅相关资料)
全局变量,只读变量,默认值1024字节,整型值,取值范围0~1048576
*/
performance_schema_max_sql_text_length=1024
/*
控制存入events_statements_current,events_statements_history和events_statements_history_long语句事件表中的SQL_TEXT列的最大SQL长度字节数。 超出系统变量performance_schema_max_sql_text_length的部分将被丢弃,不会记录,一般情况下不需要调整该参数,除非被截断的部分与其他SQL比起来有很大差异
全局变量,只读变量,整型值,默认值为1024字节,取值范围为0~1048576,5.7.6版本引入
降低系统变量performance_schema_max_sql_text_length值可以减少内存使用,但如果汇总的SQL中,被截断部分有较大差异,会导致没有办法再对这些有较大差异的SQL进行区分。 增加该系统变量值会增加内存使用,但对于汇总SQL来讲可以更精准地区分不同的部分。
*/
复制代码

六、重要配置表的相关说明

配置表之间存在相互关联关系,按照配置影响的先后顺序,可添加为:

哇塞,最详细的MySQL调优性能监控之performance schema

1、performance_timers表

中记录了server中有哪些可用的事件计时器

mysql> select * from performance_timers;
+-------------+-----------------+------------------+----------------+
| TIMER_NAME  | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |
+-------------+-----------------+------------------+----------------+
| CYCLE       |      3599393034 |                1 |             22 |
| NANOSECOND  |      1000000000 |                1 |             70 |
| MICROSECOND |         1000000 |                1 |             76 |
| MILLISECOND |            1037 |                1 |             76 |
| TICK        |             103 |                1 |           1800 |
+-------------+-----------------+------------------+----------------+
5 rows in set (0.00 sec)
复制代码

字段解释

​ timer_name:表示可用计时器名称,CYCLE是基于CPU周期计数器的定时器
​ timer_frequency:表示每秒钟对应的计时器单位的数量,CYCLE计时器的换算值与CPU的频率相关、
​ timer_resolution:计时器精度值,表示在每个计时器被调用时额外增加的值
​ timer_overhead:表示在使用定时器获取事件时开销的最小周期值

2、setup_timers

表中记录当前使用的事件计时器信息

mysql> select * from setup_timers;
+-------------+-------------+
| NAME        | TIMER_NAME  |
+-------------+-------------+
| idle        | MICROSECOND |
| wait        | CYCLE       |
| stage       | NANOSECOND  |
| statement   | NANOSECOND  |
| transaction | NANOSECOND  |
+-------------+-------------+
5 rows in set, 1 warning (0.00 sec)
复制代码

字段解释

​ name:计时器类型,对应某个事件类别
​ timer_name:计时器类型名称

3、setup_consumers表

列出了consumers可配置列表项

mysql> select * from 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             | YES     |
| events_waits_history             | YES     |
| events_waits_history_long        | YES     |
| global_instrumentation           | YES     |
| thread_instrumentation           | YES     |
| statements_digest                | YES     |
+----------------------------------+---------+
15 rows in set (0.00 sec)
复制代码

字段解释

​ NAME:consumers配置名称
​ ENABLED:consumers是否启用,有效值为YES或NO,此列可以使用UPDATE语句修改。

4、setup_instruments 表

列出了instruments 列表配置项,即代表了哪些事件支持被收集:

SELECT * FROM setup_instruments;
1023 rows in set (0.00 sec)
复制代码

字段解释

​ NAME:instruments名称,instruments名称可能具有多个部分并形成层次结构
​ ENABLED:instrumetns是否启用,有效值为YES或NO,此列可以使用UPDATE语句修改。如果设置为NO,则这个instruments不会被执行,不会产生任何的事件信息
​ TIMED:instruments是否收集时间信息,有效值为YES或NO,此列可以使用UPDATE语句修改,如果设置为NO,则这个instruments不会收集时间信息

5、setup_actors表

初始内容是匹配任何用户和主机,因此对于所有前台线程,默认情况下启用监视和历史事件收集功能

mysql> SELECT * FROM setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| %    | %    | %    | YES     | YES     |
+------+------+------+---------+---------+
1 row in set (0.00 sec)
复制代码

字段解释

​ HOST:与grant语句类似的主机名,一个具体的字符串名字,或使用“%”表示“任何主机”
​ USER:一个具体的字符串名称,或使用“%”表示“任何用户”
​ ROLE:当前未使用,MySQL 8.0中才启用角色功能
​ ENABLED:是否启用与HOST,USER,ROLE匹配的前台线程的监控功能,有效值为:YES或NO
​ HISTORY:是否启用与HOST, USER,ROLE匹配的前台线程的历史事件记录功能,有效值为:YES或NO

6、setup_objects表

控制performance_schema是否监视特定对象。默认情况下,此表的最大行数为100行。

mysql> SELECT * FROM setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA      | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| EVENT       | mysql              | %           | NO      | NO    |
| EVENT       | performance_schema | %           | NO      | NO    |
| EVENT       | information_schema | %           | NO      | NO    |
| EVENT       | %                  | %           | YES     | YES   |
| FUNCTION    | mysql              | %           | NO      | NO    |
| FUNCTION    | performance_schema | %           | NO      | NO    |
| FUNCTION    | information_schema | %           | NO      | NO    |
| FUNCTION    | %                  | %           | YES     | YES   |
| PROCEDURE   | mysql              | %           | NO      | NO    |
| PROCEDURE   | performance_schema | %           | NO      | NO    |
| PROCEDURE   | information_schema | %           | NO      | NO    |
| PROCEDURE   | %                  | %           | YES     | YES   |
| TABLE       | mysql              | %           | NO      | NO    |
| TABLE       | performance_schema | %           | NO      | NO    |
| TABLE       | information_schema | %           | NO      | NO    |
| TABLE       | %                  | %           | YES     | YES   |
| TRIGGER     | mysql              | %           | NO      | NO    |
| TRIGGER     | performance_schema | %           | NO      | NO    |
| TRIGGER     | information_schema | %           | NO      | NO    |
| TRIGGER     | %                  | %           | YES     | YES   |
+-------------+--------------------+-------------+---------+-------+
20 rows in set (0.00 sec)
复制代码

字段解释

​ OBJECT_TYPE:instruments类型,有效值为:“EVENT”(事件调度器事件)、“FUNCTION”(存储函数)、“PROCEDURE”(存储过程)、“TABLE”(基表)、“TRIGGER”(触发器),TABLE对象类型的配置会影响表I/O事件(wait/io/table/sql/handler instrument)和表锁事件(
wait/lock/table/sql/handler instrument)的收集
​ OBJECT_SCHEMA:某个监视类型对象涵盖的数据库名称,一个字符串名称,或“%”(表示“任何数据库”)
​ OBJECT_NAME:某个监视类型对象涵盖的表名,一个字符串名称,或“%”(表示“任何数据库内的对象”)
​ ENABLED:是否开启对某个类型对象的监视功能,有效值为:YES或NO。此列可以修改
​ TIMED:是否开启对某个类型对象的时间收集功能,有效值为:YES或NO,此列可以修改

7、threads表

对于每个server线程生成一行包含线程相关的信息

select * from threads;
26 rows in set (0.00 sec)
复制代码

字段解释

​ THREAD_ID:线程的唯一标识符(ID)
​ NAME:与server中的线程检测代码相关联的名称(注意,这里不是instruments名称)
​ TYPE:线程类型,有效值为:FOREGROUND、BACKGROUND。分别表示前台线程和后台线程
​ PROCESSLIST_ID:对应
INFORMATION_SCHEMA.PROCESSLIST表中的ID列。
​ PROCESSLIST_USER:与前台线程相关联的用户名,对于后台线程为NULL。
​ PROCESSLIST_HOST:与前台线程关联的客户端的主机名,对于后台线程为NULL。
​ PROCESSLIST_DB:线程的默认数据库,如果没有,则为NULL。
​ PROCESSLIST_COMMAND:对于前台线程,该值代表着当前客户端正在执行的command类型,如果是sleep则表示当前会话处于空闲状态
​ PROCESSLIST_TIME:当前线程已处于当前线程状态的持续时间(秒)
​ PROCESSLIST_STATE:表示线程正在做什么事情。
​ PROCESSLIST_INFO:线程正在执行的语句,如果没有执行任何语句,则为NULL。
​ PARENT_THREAD_ID:如果这个线程是一个子线程(由另一个线程生成),那么该字段显示其父线程ID
​ ROLE:暂未使用
​ INSTRUMENTED:线程执行的事件是否被检测。有效值:YES、NO
​ HISTORY:是否记录线程的历史事件。有效值:YES、NO *
​ THREAD_OS_ID:由操作系统层定义的线程或任务标识符(ID):

注意

在performance_schema库中还包含了很多其他的库和表,能对数据库的性能做完整的监控,大家需要参考官网详细了解。

七、performance_schema实践操作

​ 基本了解了表的相关信息之后,可以通过这些表进行实际的查询操作来进行实际的分析。

--1、哪类的SQL执行最多?
SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--2、哪类SQL的平均响应时间最多?
SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--3、哪类SQL排序记录数最多?
SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--4、哪类SQL扫描记录数最多?
SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--5、哪类SQL使用临时表最多?
SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--6、哪类SQL返回结果集最多?
SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--7、哪个表物理IO最多?
SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC
--8、哪个表逻辑IO最多?
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC
--9、哪个索引访问最多?
SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC
--10、哪个索引从来没有用过?
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;
--11、哪个等待事件消耗时间最多?
SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC
--12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息
SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%count(*)%';
--12-2、查看每个阶段的时间消耗
SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553;
--12-3、查看每个阶段的锁等待情况
SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;
复制代码

哇塞,最详细的MySQL调优性能监控之performance schema

说明:本文限于篇幅,故而只展示部分java内容,完整的Java学习文档小编已经帮你整理好了,有需要的朋友私信我(需要)即可免费领取Java、大厂面试学习资料哦!

哇塞,最详细的MySQL调优性能监控之performance schema

Guess you like

Origin juejin.im/post/7079683853182304286