15.16 InnoDB与MySQL的Performance Schema的融合

本章对InnoDB与Performance Schema的融合提供了一个简要介绍。要查阅完整的Performance Schema文档,请查阅第27张,MySQL Performance Schema

你可以使用MySQL数据库Performance Schema的特性来对某些InnoDB内部操作进行分析。这类调优主要适用于想要评估优化策略以解决性能瓶颈的高级用户。DBA们也可以使用这个功能来进行容量规划,来查看典型工作负载在特定cpu,内存,和磁盘存储配置下是否会遇到性能问题。如果是,就需要判断是否可以通过提高系统某方面的容量来提高性能。

要使用这个功能来检查InnoDB性能:

  • 你必须熟悉如何使用Performance Schema。例如,你必须知道如何启用仪器(instruments,这里似乎翻译为 组件 更为合适)和消费者,怎样通过查询performance_schema库中的表来查看数据。要查看概要介绍,请查阅章节27.1,“Performance Schema Quick Start”

  • 你必须熟悉可用于InnoDB的Performance Schema组件。想要查阅InnoDB相关的组件,你可以查询setup_instruments表,查看名字中包含innodb的组件。

mysql> SELECT *
 FROM performance_schema.setup_instruments
 WHERE NAME LIKE '%innodb%';
+-------------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+-------------------------------------------------------+---------+-------+
| wait/synch/mutex/innodb/commit_cond_mutex | NO | NO |
| wait/synch/mutex/innodb/innobase_share_mutex | NO | NO |
| wait/synch/mutex/innodb/autoinc_mutex | NO | NO |
| wait/synch/mutex/innodb/buf_pool_mutex | NO | NO |
| wait/synch/mutex/innodb/buf_pool_zip_mutex | NO | NO |
| wait/synch/mutex/innodb/cache_last_read_mutex | NO | NO |
| wait/synch/mutex/innodb/dict_foreign_err_mutex | NO | NO |
| wait/synch/mutex/innodb/dict_sys_mutex | NO | NO |
| wait/synch/mutex/innodb/recalc_pool_mutex | NO | NO |
...
| wait/io/file/innodb/innodb_data_file | YES | YES |
| wait/io/file/innodb/innodb_log_file | YES | YES |
| wait/io/file/innodb/innodb_temp_file | YES | YES |
| stage/innodb/alter table (end) | YES | YES |
| stage/innodb/alter table (flush) | YES | YES |
| stage/innodb/alter table (insert) | YES | YES |
| stage/innodb/alter table (log apply index) | YES | YES |
| stage/innodb/alter table (log apply table) | YES | YES |
| stage/innodb/alter table (merge sort) | YES | YES |
| stage/innodb/alter table (read PK and internal sort) | YES | YES |
| stage/innodb/buffer pool load | YES | YES |
| memory/innodb/buf_buf_pool | NO | NO |
| memory/innodb/dict_stats_bg_recalc_pool_t | NO | NO |
| memory/innodb/dict_stats_index_map_t | NO | NO |
| memory/innodb/dict_stats_n_diff_on_level | NO | NO |
| memory/innodb/other | NO | NO |
| memory/innodb/row_log_buf | NO | NO |
| memory/innodb/row_merge_sort | NO | NO |
| memory/innodb/std | NO | NO |
| memory/innodb/sync_debug_latches | NO | NO |
| memory/innodb/trx_sys_t::rw_trx_ids | NO | NO |
...
+-------------------------------------------------------+---------+-------+
155 rows in set (0.00 sec)

想要查看更多关于相关组件中的InnoDB对象的信息,你可以查询Performance Schema数据库中的instances表,这些表提供了更多关于相关对象的信息。与InnoDB相关的Instance表包括:

  • mutex_instances表。
  • rwlock_instances表。
  • cond_instances表。
  • file_instances表。
    此处不包含与InnoDB的buffer pool相关的Mutexes和读写锁。这同样适用于SHOW ENGINE INNODB MUTEX命令的输出。

例如,想要在执行文件I/O操作时查看Performance Schema列出的InnoDB文件对象的信息,你可以执行下面的查询:

mysql> SELECT *
 FROM performance_schema.file_instances
 WHERE EVENT_NAME LIKE '%innodb%'\G
*************************** 1. row ***************************
 FILE_NAME: /home/dtprice/mysql-8.2/data/ibdata1
EVENT_NAME: wait/io/file/innodb/innodb_data_file
OPEN_COUNT: 3
*************************** 2. row ***************************
 FILE_NAME: /home/dtprice/mysql-8.2/data/#ib_16384_0.dblwr
EVENT_NAME: wait/io/file/innodb/innodb_dblwr_file
OPEN_COUNT: 2
*************************** 3. row ***************************
 FILE_NAME: /home/dtprice/mysql-8.2/data/#ib_16384_1.dblwr
EVENT_NAME: wait/io/file/mysql-8.2/innodb_dblwr_file
OPEN_COUNT: 2
...

如果你对InnoDB相关的对象感兴趣,可以在查询这些表时使用子句 WHERE EVENT_NAME LIKE ‘%innodb%’ 或 WHERE NAME LIKE ‘%innodb%’(如果需要的话)。