MySQL8-中文参考-七十三-

98 阅读44分钟

MySQL8 中文参考(七十三)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

17.15 InnoDB INFORMATION_SCHEMA 表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema.html

17.15.1 InnoDB INFORMATION_SCHEMA 关于压缩的表

17.15.2 InnoDB INFORMATION_SCHEMA 事务和锁信息表

17.15.3 InnoDB INFORMATION_SCHEMA 模式对象表

17.15.4 InnoDB INFORMATION_SCHEMA 全文索引表

17.15.5 InnoDB INFORMATION_SCHEMA 缓冲池表

17.15.6 InnoDB INFORMATION_SCHEMA 指标表

17.15.7 InnoDB INFORMATION_SCHEMA 临时表信息表

17.15.8 从 INFORMATION_SCHEMA.FILES 检索 InnoDB 表空间元数据

本节提供了关于InnoDB INFORMATION_SCHEMA 表的信息和使用示例。

InnoDB INFORMATION_SCHEMA 表提供了关于InnoDB 存储引擎各个方面的元数据、状态信息和统计信息。您可以通过在INFORMATION_SCHEMA 数据库上发出SHOW TABLES语句来查看InnoDB INFORMATION_SCHEMA 表的列表:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB%';

对于表定义,请参阅第 28.4 节,“INFORMATION_SCHEMA InnoDB 表”。关于MySQL INFORMATION_SCHEMA 数据库的一般信息,请参阅第二十八章,“INFORMATION_SCHEMA 表”。

17.15.1 关于压缩的 InnoDB INFORMATION_SCHEMA 表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-compression-tables.html

17.15.1.1 INNODB_CMP 和 INNODB_CMP_RESET

17.15.1.2 INNODB_CMPMEM 和 INNODB_CMPMEM_RESET

17.15.1.3 使用压缩信息模式表

有两对InnoDB INFORMATION_SCHEMA关于压缩的表,可以提供关于整体压缩效果的见解:

  • INNODB_CMPINNODB_CMP_RESET 提供有关压缩操作次数和执行压缩所花费时间的信息。

  • INNODB_CMPMEMINNODB_CMPMEM_RESET 提供有关为压缩分配内存的信息。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-innodb_cmp.html

17.15.1.1 INNODB_CMP 和 INNODB_CMP_RESET

INNODB_CMPINNODB_CMP_RESET 表提供关于与压缩表相关操作的状态信息,这些操作在第 17.9 节,“InnoDB 表和页面压缩”中有描述。PAGE_SIZE列报告了压缩的页面大小。

这两个表具有相同的内容,但从INNODB_CMP_RESET读取会重置有关压缩和解压操作的统计信息。例如,如果您每 60 分钟归档一次INNODB_CMP_RESET的输出,您将看到每个小时周期的统计信息。如果您监视INNODB_CMP的输出(确保永远不要读取INNODB_CMP_RESET),您将看到自 InnoDB 启动以来的累积统计信息。

有关表定义,请参见第 28.4.6 节,“INFORMATION_SCHEMA INNODB_CMP 和 INNODB_CMP_RESET 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-innodb_cmpmem.html

17.15.1.2 INNODB_CMPMEM 和 INNODB_CMPMEM_RESET

INNODB_CMPMEMINNODB_CMPMEM_RESET表提供有关位于缓冲池中的压缩页面的状态信息。请参阅第 17.9 节,“InnoDB 表和页面压缩”以获取有关压缩表和缓冲池使用的更多信息。INNODB_CMPINNODB_CMP_RESET表应提供有关压缩的更有用的统计信息。

内部细节

InnoDB 使用一个 buddy allocator 系统来管理分配给各种大小的页面的内存,从 1KB 到 16KB。这里描述的两个表的每一行对应一个单独的页面大小。

INNODB_CMPMEMINNODB_CMPMEM_RESET表具有相同的内容,但从INNODB_CMPMEM_RESET读取会重置有关重定位操作的统计信息。例如,如果每 60 分钟归档一次INNODB_CMPMEM_RESET的输出,它将显示每小时的统计信息。如果你从未读取过INNODB_CMPMEM_RESET,而是监视INNODB_CMPMEM的输出,它将显示自InnoDB启动以来的累积统计信息。

有关表定义,请参见第 28.4.7 节,“INFORMATION_SCHEMA INNODB_CMPMEM 和 INNODB_CMPMEM_RESET 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples-compression-sect.html

17.15.1.3 使用压缩信息模式表

示例 17.1 使用压缩信息模式表

以下是包含压缩表的数据库的示例输出(参见第 17.9 节,“InnoDB 表和页压缩”,INNODB_CMPINNODB_CMP_PER_INDEXINNODB_CMPMEM)。

以下表格显示了在轻量级工作负载下INFORMATION_SCHEMA.INNODB_CMP的内容。缓冲池中唯一包含的压缩页大小为 8K。自统计数据重置以来,压缩或解压页的时间不到一秒,因为COMPRESS_TIMEUNCOMPRESS_TIME列的值为零。

页大小压缩操作压缩操作成功压缩时间解压操作解压时间
102400000
204800000
409600000
819210489210610
1638400000

根据INNODB_CMPMEM,缓冲池中有 6169 个压缩的 8KB 页。唯一的其他分配块大小为 64 字节。INNODB_CMPMEM中最小的PAGE_SIZE用于那些在缓冲池中不存在未压缩页的压缩页的块描述符。我们看到有 5910 个这样的页。间接地,我们看到 259(6169-5910)个压缩页也以未压缩形式存在于缓冲池中。

下表显示了在轻负载工作负载下INFORMATION_SCHEMA.INNODB_CMPMEM的内容。由于压缩页内存分配器的碎片化,一些内存无法使用:SUM(PAGE_SIZE*PAGES_FREE)=6784。这是因为小内存分配请求通过从主缓冲池分配的 16K 块开始,使用伙伴分配系统来拆分更大的块来满足。碎片化很低是因为一些已分配的块已经被重定位(复制)以形成更大的相邻空闲块。这些复制的SUM(PAGE_SIZE*RELOCATION_OPS)字节消耗不到一秒的时间(SUM(RELOCATION_TIME)=0)

页大小已使用页数空闲页数重定位操作重定位时间
645910024360
1280100
2560000
5120100
10240000
20480100
40960100
81926169050
163840000

17.15.2 InnoDB INFORMATION_SCHEMA 事务和锁定信息

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-transactions.html

17.15.2.1 使用 InnoDB 事务和锁定信息

17.15.2.2 InnoDB 锁和锁等待信息

17.15.2.3 InnoDB 事务和锁定信息的持久性和一致性

注意

本节描述由 Performance Schema data_locksdata_lock_waits 表公开的锁定信息,这些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。有关以旧的INFORMATION_SCHEMA表为基础撰写的类似讨论,请参阅 InnoDB INFORMATION_SCHEMA 事务和锁定信息,在 MySQL 5.7 参考手册中。

一个INFORMATION_SCHEMA表和两个 Performance Schema 表使您能够监视InnoDB事务并诊断潜在的锁定问题:

  • INNODB_TRX:这个INFORMATION_SCHEMA表提供有关每个当前在InnoDB中执行的事务的信息,包括事务状态(例如,它是正在运行还是等待锁),事务开始时间以及事务正在执行的特定 SQL 语句。

  • data_locks:这个 Performance Schema 表包含每个持有锁和每个被阻塞等待持有锁释放的锁请求的行:

    • 对于每个持有的锁都有一行,无论持有锁的事务的状态如何(INNODB_TRX.TRX_STATERUNNINGLOCK WAITROLLING BACKCOMMITTING)。

    • 每个在 InnoDB 中等待另一个事务释放锁的事务(INNODB_TRX.TRX_STATELOCK WAIT)都被一个阻塞的锁请求所阻塞。该阻塞的锁请求是由另一个事务以不兼容模式持有的行或表锁引起的。锁请求的模式总是与阻止请求的持有锁的模式不兼容(读 vs. 写,共享 vs. 独占)。

      被阻塞的事务在另一个事务提交或回滚后才能继续,从而释放所请求的锁。对于每个被阻塞的事务,data_locks 包含一行,描述了事务请求的每个锁以及等待的锁。

  • data_lock_waits:这个性能模式表指示哪些事务正在等待特定的锁,或者哪个锁正在等待特定的事务。对于每个被阻塞的事务,这个表包含一个或多个行,指示它请求的锁以及阻止该请求的任何锁。REQUESTING_ENGINE_LOCK_ID 值指的是事务请求的锁,BLOCKING_ENGINE_LOCK_ID 值指的是(由另一个事务持有的)阻止第一个事务继续的锁。对于任何被阻塞的事务,data_lock_waits 中的所有行都具有相同的 REQUESTING_ENGINE_LOCK_ID 值,但 BLOCKING_ENGINE_LOCK_ID 值不同。

有关上述表的更多信息,请参见 第 28.4.28 节,“INFORMATION_SCHEMA INNODB_TRX 表”,第 29.12.13.1 节,“data_locks 表”,以及 第 29.12.13.2 节,“data_lock_waits 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples.html

17.15.2.1 使用 InnoDB 事务和锁定信息

注意

本节描述了由性能模式data_locksdata_lock_waits表公开的锁定信息,这些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA中的INNODB_LOCKSINNODB_LOCK_WAITS表。有关以旧的INFORMATION_SCHEMA表为基础的类似讨论,请参阅使用 InnoDB 事务和锁定信息,在 MySQL 5.7 参考手册中。

识别阻塞事务

有时候确定哪个事务阻塞另一个是有帮助的。包含有关InnoDB事务和数据锁的信息的表使您能够确定哪个事务正在等待另一个事务,以及正在请求哪个资源。(有关这些表的描述,请参见第 17.15.2 节,“InnoDB INFORMATION_SCHEMA 事务和锁定信息”。)

假设有三个会话同时运行。每个会话对应一个 MySQL 线程,并在另一个之后执行一个事务。考虑当这些会话发出以下语句但尚未提交其事务时系统的状态:

  • 会话 A:

    BEGIN;
    SELECT a FROM t FOR UPDATE;
    SELECT SLEEP(100);
    
  • 会话 B:

    SELECT b FROM t FOR UPDATE;
    
  • 会话 C:

    SELECT c FROM t FOR UPDATE;
    

在这种情况下,使用以下查询查看哪些事务正在等待,哪些事务正在阻塞它们:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

或者更简单地,使用sys模式的innodb_lock_waits视图:

SELECT
  waiting_trx_id,
  waiting_pid,
  waiting_query,
  blocking_trx_id,
  blocking_pid,
  blocking_query
FROM sys.innodb_lock_waits;

如果阻塞查询报告了 NULL 值,请参阅在发出会话变为空闲后识别阻塞查询。

等待 trx id等待线程等待查询阻塞 trx id阻塞线程阻塞查询
A46SELECT b FROM t FOR UPDATEA35SELECT SLEEP(100)
A57SELECT c FROM t FOR UPDATEA35SELECT SLEEP(100)
A57SELECT c FROM t FOR UPDATEA46SELECT b FROM t FOR UPDATE

在上表中,您可以通过“等待查询”或“阻塞查询”列来识别会话。正如您所看到的:

  • 会话 B(trx id A4,线程6)和会话 C(trx id A5,线程7)都在等待会话 A(trx id A3,线程5)。

  • 会话 C 正在等待会话 B 以及会话 A。

你可以在INFORMATION_SCHEMAINNODB_TRX表以及性能模式的data_locksdata_lock_waits表中查看底层数据。

以下表格显示了INNODB_TRX表的一些示例内容。

事务 ID事务状态事务开始时间请求锁 ID等待开始时间权重MySQL 线程 ID查询语句
A3RUN­NING2008-01-15 16:44:54NULLNULL25SELECT SLEEP(100)
A4LOCK WAIT2008-01-15 16:45:09A4:1:3:22008-01-15 16:45:0926SELECT b FROM t FOR UPDATE
A5LOCK WAIT2008-01-15 16:45:14A5:1:3:22008-01-15 16:45:1427SELECT c FROM t FOR UPDATE

以下表格显示了data_locks表的一些示例内容。

锁 ID锁事务 ID锁模式锁类型锁模式锁表锁索引锁数据
A3:1:3:2A3XRECORDtesttPRIMARY0x0200
A4:1:3:2A4XRECORDtesttPRIMARY0x0200
A5:1:3:2A5XRECORDtesttPRIMARY0x0200

以下表格显示了data_lock_waits表的一些示例内容。

请求事务 ID请求锁 ID阻塞事务 ID阻塞锁 ID
A4A4:1:3:2A3A3:1:3:2
A5A5:1:3:2A3A3:1:3:2
A5A5:1:3:2A4A4:1:3:2
在发出会话变为空闲后识别阻塞查询

在识别阻塞事务时,如果发出查询的会话已经变为空闲,则会报告阻塞查询的 NULL 值。在这种情况下,使用以下步骤确定阻塞查询:

  1. 确定阻塞事务的进程列表 ID。在sys.innodb_lock_waits表中,阻塞事务的进程列表 ID 是blocking_pid值。

  2. 使用blocking_pid,查询 MySQL 性能模式的threads表以确定阻塞事务的THREAD_ID。例如,如果blocking_pid为 6,则发出以下查询:

    SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
    
  3. 使用THREAD_ID,查询性能模式events_statements_current表以确定线程执行的最后一个查询。例如,如果THREAD_ID为 28,则发出此查询:

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current
    WHERE THREAD_ID = 28\G
    
  4. 如果线程执行的最后一个查询不足以确定为何保持锁定,则可以查询性能模式events_statements_history表,查看线程执行的最后 10 个语句。

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history
    WHERE THREAD_ID = 28 ORDER BY EVENT_ID;
    
将 InnoDB 事务与 MySQL 会话相关联

有时将内部InnoDB锁定信息与 MySQL 维护的会话级信息相关联是有用的。例如,您可能想要知道,对于给定的InnoDB事务 ID,持有锁定并因此阻止其他事务的 MySQL 会话 ID 和会话名称。

下面来自INFORMATION_SCHEMA INNODB_TRX表和性能模式data_locksdata_lock_waits表的输出来自一个负载较重的系统。可以看到,有几个事务正在运行。

下面的data_locksdata_lock_waits表显示:

  • 事务77F(执行INSERTINNODB_TRX 表中显示的查询可能存在不一致。有关解释,请参见 第 17.15.2.3 节,“InnoDB 事务和锁定信息的持久性和一致性”。

以下表格显示了运行重 工作负载 系统的 PROCESSLIST 表的内容。

ID用户主机数据库命令时间状态信息
384rootlocalhosttestQuery10updateINSERT INTO t2 VALUES …
257rootlocalhosttestQuery3updateINSERT INTO t2 VALUES …
130rootlocalhosttestQuery0updateINSERT INTO t2 VALUES …
61rootlocalhosttestQuery1updateINSERT INTO t2 VALUES …
8rootlocalhosttestQuery1updateINSERT INTO t2 VALUES …
4rootlocalhosttestQuery0preparingSELECT * FROM PROCESSLIST
2rootlocalhosttestSleep566NULL

以下表格显示了运行重 工作负载 系统的 INNODB_TRX 表的内容。

事务 ID事务状态事务开始时间事务请求锁 ID事务等待开始时间事务权重事务 MySQL 线程 ID事务查询
77FLOCK WAIT2008-01-15 13:10:1677F2008-01-15 13:10:161876INSERT INTO t09 (D, B, C) VALUES …
77ELOCK WAIT2008-01-15 13:10:1677E2008-01-15 13:10:161875INSERT INTO t09 (D, B, C) VALUES …
77DLOCK WAIT2008-01-15 13:10:1677D2008-01-15 13:10:161874INSERT INTO t09 (D, B, C) VALUES …
77BLOCK WAIT2008-01-15 13:10:1677B:733:12:12008-01-15 13:10:164873INSERT INTO t09 (D, B, C) VALUES …
77ARUN­NING2008-01-15 13:10:16NULLNULL4872SELECT b, c FROM t09 WHERE …
E56LOCK WAIT2008-01-15 13:10:06E56:743:6:22008-01-15 13:10:065384INSERT INTO t2 VALUES …
E55LOCK WAIT2008-01-15 13:10:06E55:743:38:22008-01-15 13:10:13965257INSERT INTO t2 VALUES …
19CRUN­NING2008-01-15 13:09:10NULLNULL2900130INSERT INTO t2 VALUES …
E15运行中2008-01-15 13:08:59NULLNULL539561INSERT INTO t2 VALUES …
51D运行中2008-01-15 13:08:47NULLNULL98078INSERT INTO t2 VALUES …
事务标识事务状态事务开始时间事务请求的锁标识事务等待开始时间事务权重事务 MySQL 线程标识事务查询

下表显示了运行重 工作负载 系统的 data_lock_waits 表的内容。

请求事务标识请求的锁标识阻塞事务标识阻塞的锁标识
77F77F:80677E77E:806
77F77F:80677D77D:806
77F77F:80677B77B:806
77E77E:80677D77D:806
77E77E:80677B77B:806
77D77D:80677B77B:806
77B77B:733:12:177A77A:733:12:1
E56E56:743:6:2E55E55:743:6:2
E55E55:743:38:219C19C:743:38:2

下表显示了运行重 工作负载 系统的 data_locks 表的内容。

锁标识锁事务标识锁模式锁类型锁模式锁表锁索引锁数据
77F:80677FAUTO_INCTABLEtestt09NULLNULL
77E:80677EAUTO_INCTABLEtestt09NULLNULL
77D:80677DAUTO_INCTABLEtestt09NULLNULL
77B:80677BAUTO_INCTABLEtestt09NULLNULL
77B:733:12:177BXRECORDtestt09PRIMARYsupremum pseudo-record
77A:733:12:177AXRECORDtestt09PRIMARYsupremum pseudo-record
E56:743:6:2E56SRECORDtestt2PRIMARY0, 0
E55:743:6:2E55XRECORDtestt2PRIMARY0, 0
E55:743:38:2E55SRECORDtestt2PRIMARY1922, 1922
19C:743:38:219CXRECORDtestt2PRIMARY1922, 1922
锁标识锁事务标识锁模式锁类型锁模式锁表锁索引锁数据

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-understanding-innodb-locking.html

17.15.2.2 InnoDB 锁和锁等待信息

注意

本节描述了由 Performance Schema data_locksdata_lock_waits 表公开的锁信息,它们在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。对于以旧的INFORMATION_SCHEMA表为基础编写的类似讨论,请参阅 InnoDB 锁和锁等待信息,在 MySQL 5.7 参考手册中。

当一个事务更新表中的一行,或者用SELECT FOR UPDATE锁定它时,InnoDB会为该行建立一个锁的列表或队列。同样,InnoDB为表级锁维护一个锁的列表。如果第二个事务想要更新一个已被先前事务以不兼容模式锁定的行,或者锁定一个已被先前事务锁定的表,InnoDB会为该行添加一个锁请求到相应的队列中。为了让一个事务获取锁,所有之前为该行或表输入的不兼容锁请求必须被移除(这发生在持有或请求这些锁的事务提交或回滚时)。

一个事务可能对不同的行或表发出任意数量的锁请求。在任何给定时间,一个事务可能请求另一个事务持有的锁,此时它会被那个事务阻塞。请求锁的事务必须等待持有阻塞锁的事务提交或回滚。如果一个事务没有在等待锁,它处于RUNNING状态。如果一个事务在等待锁,它处于LOCK WAIT状态。(INFORMATION_SCHEMA INNODB_TRX 表显示事务状态值。)

Performance Schema data_locks 表为每个LOCK WAIT事务保存一行或多行,指示阻止其进展的任何锁请求。该表还包含描述每个锁的一行,该锁在等待给定行或表的锁队列中。Performance Schema data_lock_waits 表显示事务已持有的锁阻塞了其他事务请求的锁。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-internal-data.html

17.15.2.3 InnoDB 事务和锁信息的持久性和一致性

注意

本节描述了由性能模式 data_locksdata_lock_waits 表公开的锁信息,这些表在 MySQL 8.0 中取代了 INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。有关以旧的 INFORMATION_SCHEMA 表为基础的类似讨论,请参阅 InnoDB 事务和锁信息的持久性和一致性,在 MySQL 5.7 参考手册 中。

事务和锁定表(INFORMATION_SCHEMA INNODB_TRX 表,性能模式 data_locksdata_lock_waits 表)公开的数据代表了对快速变化数据的一瞥。这不像用户表,其中数据仅在应用程序发起的更新发生时才会更改。底层数据是内部系统管理的数据,可以非常快速地更改:

  • INNODB_TRXdata_locksdata_lock_waits 表之间的数据可能不一致。

    data_locksdata_lock_waits 表公开了来自 InnoDB 存储引擎的实时数据,提供有关 INNODB_TRX 表中事务的锁信息。从锁表中检索的数据存在于执行 SELECT 时,但在查询结果被客户端消耗时可能已经消失或更改。

    data_locksdata_lock_waits连接可以显示在data_lock_waits中标识不再存在或尚不存在的data_locks中的父行的行。

  • 事务和锁定表中的数据可能与INFORMATION_SCHEMA PROCESSLIST表或性能模式threads表中的数据不一致。

    例如,当比较InnoDB事务和锁定表中的数据与PROCESSLIST表中的数据时,应该小心。即使您发出单个SELECT(例如连接INNODB_TRXPROCESSLIST),这些表的内容通常不一致。INNODB_TRX可能引用PROCESSLIST中不存在的行,或者当前执行的事务中INNODB_TRX.TRX_QUERY显示的 SQL 查询与PROCESSLIST.INFO中的查询不同。

17.15.3 InnoDB INFORMATION_SCHEMA 模式对象表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-system-tables.html

您可以使用InnoDB INFORMATION_SCHEMA表提取关于由InnoDB管理的模式对象的元数据。这些信息来自数据字典。传统上,您可以使用第 17.17 节“InnoDB 监视器”中的技术,设置InnoDB监视器并解析SHOW ENGINE INNODB STATUS语句的输出来获取此类型的信息。InnoDB INFORMATION_SCHEMA表接口允许您使用 SQL 查询这些数据。

InnoDB INFORMATION_SCHEMA模式对象表包括下面列出的表。

INNODB_DATAFILES
INNODB_TABLESTATS
INNODB_FOREIGN
INNODB_COLUMNS
INNODB_INDEXES
INNODB_FIELDS
INNODB_TABLESPACES
INNODB_TABLESPACES_BRIEF
INNODB_FOREIGN_COLS
INNODB_TABLES

表名反映��提供的数据类型:

  • INNODB_TABLES提供了关于InnoDB表的元数据。

  • INNODB_COLUMNS提供了关于InnoDB表列的元数据。

  • INNODB_INDEXES提供了关于InnoDB索引的元数据。

  • INNODB_FIELDS提供了关于InnoDB索引的关键列(字段)的元数据。

  • INNODB_TABLESTATS提供了关于InnoDB表的低级状态信息的视图,这些信息是从内存数据结构中派生的。

  • INNODB_DATAFILES提供了InnoDB文件表和通用表空间的数据文件路径信息。

  • INNODB_TABLESPACES提供了关于InnoDB文件表、通用表和撤销表空间的元数据。

  • INNODB_TABLESPACES_BRIEF提供了关于InnoDB表空间的部分元数据。

  • INNODB_FOREIGN提供了关于在InnoDB表上定义的外键的元数据。

  • INNODB_FOREIGN_COLS提供了关于在InnoDB表上定义的外键列的元数据。

InnoDB INFORMATION_SCHEMA模式对象表可以通过TABLE_IDINDEX_IDSPACE等字段进行连接,使您可以轻松检索要研究或监视的对象的所有可用数据。

参考InnoDB INFORMATION_SCHEMA 文档,了解每个表的列信息。

示例 17.2 InnoDB INFORMATION_SCHEMA 模式对象表

本示例使用一个简单的表(t1)和一个单一索引(i1)来演示在InnoDB INFORMATION_SCHEMA模式对象表中找到的元数据类型。

  1. 创建一个测试数据库和表t1

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE t1 (
           col1 INT,
           col2 CHAR(10),
           col3 VARCHAR(10))
           ENGINE = InnoDB;
    
    mysql> CREATE INDEX i1 ON t1(col1);
    
  2. 创建表t1后,查询INNODB_TABLES以查找test/t1的元数据:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
    *************************** 1\. row ***************************
         TABLE_ID: 71
             NAME: test/t1
             FLAG: 1
           N_COLS: 6
            SPACE: 57
       ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
     INSTANT_COLS: 0
    

    t1TABLE_ID为 71。FLAG字段提供有关表格式和存储特性的位级信息。共有六列,其中三列是由InnoDB创建的隐藏列(DB_ROW_IDDB_TRX_IDDB_ROLL_PTR)。表的SPACE的 ID 为 57(值为 0 表示表位于系统表空间中)。ROW_FORMAT为 Compact。ZIP_PAGE_SIZE仅适用于具有Compressed行格式的表。INSTANT_COLS显示在使用ALTER TABLE ... ADD COLUMN添加第一个即时列之前表中的列数。

  3. 使用INNODB_TABLES中的TABLE_ID信息,查询INNODB_COLUMNS表以获取有关表列的信息。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS where TABLE_ID = 71\G
    *************************** 1\. row ***************************
         TABLE_ID: 71
             NAME: col1
              POS: 0
            MTYPE: 6
           PRTYPE: 1027
              LEN: 4
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    *************************** 2\. row ***************************
         TABLE_ID: 71
             NAME: col2
              POS: 1
            MTYPE: 2
           PRTYPE: 524542
              LEN: 10
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    *************************** 3\. row ***************************
         TABLE_ID: 71
             NAME: col3
              POS: 2
            MTYPE: 1
           PRTYPE: 524303
              LEN: 10
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    

    除了TABLE_ID和列NAME之外,INNODB_COLUMNS还提供每列的序数位置(从 0 开始递增顺序),列MTYPE或“主类型”(6 = INT,2 = CHAR,1 = VARCHAR),PRTYPE或“精确类型”(一个二进制值,其中的位表示 MySQL 数据类型、字符集代码和可空性),以及列长度(LEN)。HAS_DEFAULTDEFAULT_VALUE列仅适用于使用ALTER TABLE ... ADD COLUMN立即添加的列。

  4. 再次使用INNODB_TABLES中的TABLE_ID信息,查询INNODB_INDEXES以获取与表t1关联的索引信息。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_ID = 71 \G
    *************************** 1\. row ***************************
           INDEX_ID: 111
               NAME: GEN_CLUST_INDEX
           TABLE_ID: 71
               TYPE: 1
           N_FIELDS: 0
            PAGE_NO: 3
              SPACE: 57
    MERGE_THRESHOLD: 50
    *************************** 2\. row ***************************
           INDEX_ID: 112
               NAME: i1
           TABLE_ID: 71
               TYPE: 0
           N_FIELDS: 1
            PAGE_NO: 4
              SPACE: 57
    MERGE_THRESHOLD: 50
    

    INNODB_INDEXES返回两个索引的数据。第一个索引是GEN_CLUST_INDEX,如果表没有用户定义的聚簇索引,则InnoDB会创建一个聚簇索引。第二个索引(i1)是用户定义的二级索引。

    INDEX_ID是一个在实例中所有数据库中唯一的索引标识符。TABLE_ID标识与索引关联的表。索引TYPE值表示索引类型(1 = 聚簇索引,0 = 二级索引)。N_FILEDS值是组成索引的字段数。PAGE_NO是索引 B 树的根页号,SPACE是索引所在的表空间的 ID。非零值表示索引不位于系统表空间中。MERGE_THRESHOLD定义了索引页中数据量的百分比阈值。如果索引页中的数据量低于此值(默认为 50%),当删除行或通过更新操作缩短行时,InnoDB会尝试将索引页与相邻的索引页合并。

  5. 使用INNODB_INDEXES中的INDEX_ID信息,查询INNODB_FIELDS以获取索引i1的字段信息。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FIELDS where INDEX_ID = 112 \G
    *************************** 1\. row ***************************
    INDEX_ID: 112
        NAME: col1
         POS: 0
    

    INNODB_FIELDS提供索引字段的NAME和其在索引中的序号位置。如果索引(i1)是在多个字段上定义的,INNODB_FIELDS将为每个索引字段提供元数据。

  6. 使用INNODB_TABLES中的SPACE信息,查询INNODB_TABLESPACES表以获取有关表的表空间的信息。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE = 57 \G
    *************************** 1\. row ***************************
              SPACE: 57
              NAME: test/t1
              FLAG: 16417
        ROW_FORMAT: Dynamic
         PAGE_SIZE: 16384
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
     FS_BLOCK_SIZE: 4096
         FILE_SIZE: 114688
    ALLOCATED_SIZE: 98304
    AUTOEXTEND_SIZE: 0
    SERVER_VERSION: 8.0.23
     SPACE_VERSION: 1
        ENCRYPTION: N
             STATE: normal
    

    除了表空间的SPACE ID 和关联表的NAME之外,INNODB_TABLESPACES提供表空间FLAG数据,这是关于表空间格式和存储特性的位级信息。还提供了表空间ROW_FORMATPAGE_SIZE以及其他几个表空间元数据项。

  7. 再次使用INNODB_TABLES中的SPACE信息,查询INNODB_DATAFILES以获取表空间数据文件的位置。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE SPACE = 57 \G
    *************************** 1\. row ***************************
    SPACE: 57
     PATH: ./test/t1.ibd
    

    数据文件位于 MySQL 的data目录下的test目录中。如果在 MySQL 数据目录之外的位置使用CREATE TABLE语句的DATA DIRECTORY子句创建了 file-per-table 表空间,则表空间PATH将是一个完全限定的目录路径。

  8. 最后一步,向表t1TABLE_ID = 71)插入一行数据,并查看INNODB_TABLESTATS表中的数据。此表中的数据由 MySQL 优化器用于计算在查询InnoDB表时使用哪个索引。这些信息来自内存数据结构。

    mysql> INSERT INTO t1 VALUES(5, 'abc', 'def');
    Query OK, 1 row affected (0.06 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESTATS where TABLE_ID = 71 \G
    *************************** 1\. row ***************************
             TABLE_ID: 71
                 NAME: test/t1
    STATS_INITIALIZED: Initialized
             NUM_ROWS: 1
     CLUST_INDEX_SIZE: 1
     OTHER_INDEX_SIZE: 0
     MODIFIED_COUNTER: 1
              AUTOINC: 0
            REF_COUNT: 1
    

    STATS_INITIALIZED字段指示表是否已收集统计信息。NUM_ROWS是表中当前估计的行数。CLUST_INDEX_SIZEOTHER_INDEX_SIZE字段分别报告存储表的聚集索引和辅助索引的磁盘上的页面数。MODIFIED_COUNTER值显示被 DML 操作和外键级联操作修改的行数。AUTOINC值是任何自增操作即将发行的下一个数字。在表t1上没有定义自增列,因此该值为 0。REF_COUNT值是一个计数器。当计数器达到 0 时,表示表元数据可以从表缓存中驱逐。

示例 17.3 外键 INFORMATION_SCHEMA 模式对象表

INNODB_FOREIGNINNODB_FOREIGN_COLS表提供有关外键关系的数据。此示例使用具有外键关系的父表和子表来演示在INNODB_FOREIGNINNODB_FOREIGN_COLS表中找到的数据。

  1. 创建具有父表和子表的测试数据库:

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE parent (id INT NOT NULL,
           PRIMARY KEY (id)) ENGINE=INNODB;
    
    mysql> CREATE TABLE child (id INT, parent_id INT,
           INDEX par_ind (parent_id),
           CONSTRAINT fk1
           FOREIGN KEY (parent_id) REFERENCES parent(id)
           ON DELETE CASCADE) ENGINE=INNODB;
    
  2. 创建父表和子表后,查询INNODB_FOREIGN并找到test/childtest/parent外键关系的外键数据:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN \G
    *************************** 1\. row ***************************
          ID: test/fk1
    FOR_NAME: test/child
    REF_NAME: test/parent
      N_COLS: 1
        TYPE: 1
    

    元数据包括外键IDfk1),该外键是在子表上定义的CONSTRAINT的名称。FOR_NAME是定义外键的子表的名称。REF_NAME是父表(“被引用”表)的名称。N_COLS是外键索引中的列数。TYPE是表示有关外键列的其他信息的位标志的数值。在这种情况下,TYPE值为 1,表示为外键指定了ON DELETE CASCADE选项。有关TYPE值的更多信息,请参阅INNODB_FOREIGN表定义。

  3. 使用外键ID,查询INNODB_FOREIGN_COLS以查看有关外键列的数据。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN_COLS WHERE ID = 'test/fk1' \G
    *************************** 1\. row ***************************
              ID: test/fk1
    FOR_COL_NAME: parent_id
    REF_COL_NAME: id
             POS: 0
    

    FOR_COL_NAME是子表中外键列的名称,REF_COL_NAME是父表中引用列的名称。POS值是外键索引中键字段的序数位置,从零开始。

示例 17.4 连接 InnoDB INFORMATION_SCHEMA 模式对象表

此示例演示了连接三个InnoDB INFORMATION_SCHEMA模式对象表(INNODB_TABLESINNODB_TABLESPACESINNODB_TABLESTATS)以收集有关员工示例数据库中表的文件格式、行格式、页面大小和索引大小信息。

以下表别名用于缩短查询字符串:

  • INFORMATION_SCHEMA.INNODB_TABLES:a

  • INFORMATION_SCHEMA.INNODB_TABLESPACES:b

  • INFORMATION_SCHEMA.INNODB_TABLESTATS:c

使用IF()控制流函数来处理压缩表。如果表被压缩,索引大小将使用ZIP_PAGE_SIZE而不是PAGE_SIZE来计算。CLUST_INDEX_SIZEOTHER_INDEX_SIZE以字节报告,通过1024*1024除以以提供以兆字节(MB)为单位的索引大小。MB 值使用ROUND()函数四舍五入到零位小数。

mysql> SELECT a.NAME, a.ROW_FORMAT,
        @page_size :=
         IF(a.ROW_FORMAT='Compressed',
          b.ZIP_PAGE_SIZE, b.PAGE_SIZE)
          AS page_size,
         ROUND((@page_size * c.CLUST_INDEX_SIZE)
          /(1024*1024)) AS pk_mb,
         ROUND((@page_size * c.OTHER_INDEX_SIZE)
          /(1024*1024)) AS secidx_mb
       FROM INFORMATION_SCHEMA.INNODB_TABLES a
       INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAME
       INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAME
       WHERE a.NAME LIKE 'employees/%'
       ORDER BY a.NAME DESC;
+------------------------+------------+-----------+-------+-----------+
| NAME                   | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+------------+-----------+-------+-----------+
| employees/titles       | Dynamic    |     16384 |    20 |        11 |
| employees/salaries     | Dynamic    |     16384 |    93 |        34 |
| employees/employees    | Dynamic    |     16384 |    15 |         0 |
| employees/dept_manager | Dynamic    |     16384 |     0 |         0 |
| employees/dept_emp     | Dynamic    |     16384 |    12 |        10 |
| employees/departments  | Dynamic    |     16384 |     0 |         0 |
+------------------------+------------+-----------+-------+-----------+

17.15.4 InnoDB INFORMATION_SCHEMA FULLTEXT 索引表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-fulltext_index-tables.html

以下表格提供了 FULLTEXT 索引的元数据:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_FT%';
+-------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_FT%) |
+-------------------------------------------+
| INNODB_FT_CONFIG                          |
| INNODB_FT_BEING_DELETED                   |
| INNODB_FT_DELETED                         |
| INNODB_FT_DEFAULT_STOPWORD                |
| INNODB_FT_INDEX_TABLE                     |
| INNODB_FT_INDEX_CACHE                     |
+-------------------------------------------+

表格概述

  • INNODB_FT_CONFIG:提供关于 InnoDB 表的 FULLTEXT 索引和相关处理的元数据。

  • INNODB_FT_BEING_DELETED:提供 INNODB_FT_DELETED 表的快照;仅在 OPTIMIZE TABLE 维护操作期间使用。运行 OPTIMIZE TABLE 时,INNODB_FT_BEING_DELETED 表会被清空,并且从 INNODB_FT_DELETED 表中删除 DOC_ID 值。由于 INNODB_FT_BEING_DELETED 的内容通常寿命较短,因此该表对于监控或调试具有有限的实用性。有关在具有 FULLTEXT 索引的表上运行 OPTIMIZE TABLE 的信息,请参见 第 14.9.6 节,“调整 MySQL 全文搜索”。

  • INNODB_FT_DELETED:存储从 InnoDB 表的 FULLTEXT 索引中删除的行。为了避免在 InnoDB FULLTEXT 索引的 DML 操作期间进行昂贵的索引重组,新删除的单词信息被单独存储,当进行文本搜索时会从搜索结果中过滤掉,并且仅当对 InnoDB 表发出 OPTIMIZE TABLE 语句时才从主搜索索引中��除。

  • INNODB_FT_DEFAULT_STOPWORD:保存在创建 InnoDB 表的 FULLTEXT 索引时默认使用的 停用词 列表。

    有关INNODB_FT_DEFAULT_STOPWORD表的信息,请参阅 Section 14.9.4, “全文停用词”。

  • INNODB_FT_INDEX_TABLE:提供有关用于处理对InnoDB表的FULLTEXT索引进行文本搜索的倒排索引的信息。

  • INNODB_FT_INDEX_CACHE:提供有关FULLTEXT索引中新插入行的标记信息。为避免在 DML 操作期间进行昂贵的索引重组,新索引单词的信息被单独存储,并仅在运行OPTIMIZE TABLE时,服务器关闭时,或者缓存大小超过由innodb_ft_cache_sizeinnodb_ft_total_cache_size系统变量定义的限制时,才与主搜索索引合并。

注意

除了INNODB_FT_DEFAULT_STOPWORD表外,这些表最初是空的。在查询任何这些表之前,将innodb_ft_aux_table系统变量的值设置为包含FULLTEXT索引的表的名称(包括数据库名称)(例如,test/articles)。

示例 17.5 InnoDB FULLTEXT 索引 INFORMATION_SCHEMA 表

本示例使用具有FULLTEXT索引的表来演示FULLTEXT索引INFORMATION_SCHEMA表中包含的数据。

  1. 创建一个具有FULLTEXT索引的表并插入一些数据:

    mysql> CREATE TABLE articles (
             id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
             title VARCHAR(200),
             body TEXT,
             FULLTEXT (title,body)
           ) ENGINE=InnoDB;
    
    mysql> INSERT INTO articles (title,body) VALUES
           ('MySQL Tutorial','DBMS stands for DataBase ...'),
           ('How To Use MySQL Well','After you went through a ...'),
           ('Optimizing MySQL','In this tutorial we show ...'),
           ('1001 MySQL Tricks','1\. Never run mysqld as root. 2\. ...'),
           ('MySQL vs. YourSQL','In the following database comparison ...'),
           ('MySQL Security','When configured properly, MySQL ...');
    
  2. innodb_ft_aux_table变量设置为具有FULLTEXT索引的表的名称。如果未设置此变量,则InnoDB FULLTEXT INFORMATION_SCHEMA表为空,除了INNODB_FT_DEFAULT_STOPWORD

    mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles';
    
  3. 查询INNODB_FT_INDEX_CACHE表,显示FULLTEXT索引中新插入行的信息。为避免在 DML 操作期间进行昂贵的索引重组,新插入行的数据仍保留在FULLTEXT索引缓存中,直到运行OPTIMIZE TABLE(或者直到服务器关闭或超过缓存限制)。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;
    +------------+--------------+-------------+-----------+--------+----------+
    | WORD       | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
    +------------+--------------+-------------+-----------+--------+----------+
    | 1001       |            5 |           5 |         1 |      5 |        0 |
    | after      |            3 |           3 |         1 |      3 |       22 |
    | comparison |            6 |           6 |         1 |      6 |       44 |
    | configured |            7 |           7 |         1 |      7 |       20 |
    | database   |            2 |           6 |         2 |      2 |       31 |
    +------------+--------------+-------------+-----------+--------+----------+
    
  4. 启用 innodb_optimize_fulltext_only 系统变量,并在包含 FULLTEXT 索引的表上运行 OPTIMIZE TABLE。此操作将 FULLTEXT 索引缓存的内容刷新到主 FULLTEXT 索引中。innodb_optimize_fulltext_only 改变了 OPTIMIZE TABLE 语句在 InnoDB 表上的操作方式,并且旨在在具有 FULLTEXT 索引的 InnoDB 表上的维护操作期间临时启用。

    mysql> SET GLOBAL innodb_optimize_fulltext_only=ON;
    
    mysql> OPTIMIZE TABLE articles;
    +---------------+----------+----------+----------+
    | Table         | Op       | Msg_type | Msg_text |
    +---------------+----------+----------+----------+
    | test.articles | optimize | status   | OK       |
    +---------------+----------+----------+----------+
    
  5. 查询 INNODB_FT_INDEX_TABLE 表,查看主 FULLTEXT 索引中的数据信息,包括刚刚从 FULLTEXT 索引缓存中刷新的数据信息。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 5;
    +------------+--------------+-------------+-----------+--------+----------+
    | WORD       | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
    +------------+--------------+-------------+-----------+--------+----------+
    | 1001       |            5 |           5 |         1 |      5 |        0 |
    | after      |            3 |           3 |         1 |      3 |       22 |
    | comparison |            6 |           6 |         1 |      6 |       44 |
    | configured |            7 |           7 |         1 |      7 |       20 |
    | database   |            2 |           6 |         2 |      2 |       31 |
    +------------+--------------+-------------+-----------+--------+----------+
    

    INNODB_FT_INDEX_CACHE 表现在为空,因为 OPTIMIZE TABLE 操作刷新了 FULLTEXT 索引缓存。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;
    Empty set (0.00 sec)
    
  6. test/articles 表中删除一些记录。

    mysql> DELETE FROM test.articles WHERE id < 4;
    
  7. 查询 INNODB_FT_DELETED 表。该表记录从 FULLTEXT 索引中删除的行。为了避免在 DML 操作期间进行昂贵的索引重组,新删除记录的信息被单独存储,当进行文本搜索时从搜索结果中过滤掉,并在运行 OPTIMIZE TABLE 时从主搜索索引中删除。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
    +--------+
    | DOC_ID |
    +--------+
    |      2 |
    |      3 |
    |      4 |
    +--------+
    
  8. 运行 OPTIMIZE TABLE 来删除已删除的记录。

    mysql> OPTIMIZE TABLE articles;
    +---------------+----------+----------+----------+
    | Table         | Op       | Msg_type | Msg_text |
    +---------------+----------+----------+----------+
    | test.articles | optimize | status   | OK       |
    +---------------+----------+----------+----------+
    

    INNODB_FT_DELETED 表现在应该为空。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
    Empty set (0.00 sec)
    
  9. 查询 INNODB_FT_CONFIG 表。该表包含关于 FULLTEXT 索引和相关处理的元数据:

    • optimize_checkpoint_limit: 多少秒后运行 OPTIMIZE TABLE 停止。

    • synced_doc_id: 下一个要发行的 DOC_ID

    • stopword_table_name: 用户定义的停用词表的 database/table 名称。如果没有用户定义的停用词表,则 VALUE 列为空。

    • use_stopword: 指示是否使用停用词表,该表在创建 FULLTEXT 索引时定义。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
    +---------------------------+-------+
    | KEY                       | VALUE |
    +---------------------------+-------+
    | optimize_checkpoint_limit | 180   |
    | synced_doc_id             | 8     |
    | stopword_table_name       |       |
    | use_stopword              | 1     |
    +---------------------------+-------+
    
  10. 禁用innodb_optimize_fulltext_only,因为它只打算暂时启用:

    mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;
    

17.15.5 InnoDB INFORMATION_SCHEMA 缓冲池表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-buffer-pool-tables.html

InnoDB INFORMATION_SCHEMA缓冲池表提供有关InnoDB缓冲池内页面的缓冲池状态信息和元数据。

InnoDB INFORMATION_SCHEMA缓冲池表包括以下列出的表:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_BUFFER%';
+-----------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_BUFFER%) |
+-----------------------------------------------+
| INNODB_BUFFER_PAGE_LRU                        |
| INNODB_BUFFER_PAGE                            |
| INNODB_BUFFER_POOL_STATS                      |
+-----------------------------------------------+

表概述

  • INNODB_BUFFER_PAGE:包含InnoDB缓冲池中每个页面的信息。

  • INNODB_BUFFER_PAGE_LRU:包含关于InnoDB缓冲池中页面的信息,特别是它们在 LRU 列表中的排序方式,该列表确定在缓冲池变满时要驱逐的页面。INNODB_BUFFER_PAGE_LRU表与INNODB_BUFFER_PAGE表具有相同的列,只是INNODB_BUFFER_PAGE_LRU表具有一个LRU_POSITION列,而不是一个BLOCK_ID列。

  • INNODB_BUFFER_POOL_STATS:提供缓冲池状态信息。SHOW ENGINE INNODB STATUS输出提供了大部分相同的信息,或者可以使用InnoDB缓冲池服务器状态变量获得。

警告

在生产系统上查询INNODB_BUFFER_PAGEINNODB_BUFFER_PAGE_LRU表可能会影响性能。除非您意识到性能影响并确定其可接受,否则不要在生产系统上查询这些表。为避免影响生产系统的性能,请在测试实例上重现您想要调查的问题,并查询缓冲池统计信息。

示例 17.6 在 INNODB_BUFFER_PAGE 表中查询系统数据

此查询通过排除TABLE_NAME值为NULL或包含斜杠/或句点.的页面,提供包含系统数据的页面的近似计数,这表明用户定义了表。

mysql> SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0);
+----------+
| COUNT(*) |
+----------+
|     1516 |
+----------+

此查询返回包含系统数据的页面的大致数量,缓冲池页面的总��,以及包含系统数据的页面的大致百分比。

mysql> SELECT
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0)
       ) AS system_pages,
       (
       SELECT COUNT(*)
       FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       ) AS total_pages,
       (
       SELECT ROUND((system_pages/total_pages) * 100)
       ) AS system_page_percentage;
+--------------+-------------+------------------------+
| system_pages | total_pages | system_page_percentage |
+--------------+-------------+------------------------+
|          295 |        8192 |                      4 |
+--------------+-------------+------------------------+

通过查询 PAGE_TYPE 值可以确定缓冲池中的系统数据类型。例如,以下查询返回包含系统数据的页面中的八个不同的 PAGE_TYPE 值:

mysql> SELECT DISTINCT PAGE_TYPE FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0);
+-------------------+
| PAGE_TYPE         |
+-------------------+
| SYSTEM            |
| IBUF_BITMAP       |
| UNKNOWN           |
| FILE_SPACE_HEADER |
| INODE             |
| UNDO_LOG          |
| ALLOCATED         |
+-------------------+

示例 17.7 在 INNODB_BUFFER_PAGE 表中查询用户数据

此查询通过计算 TABLE_NAME 值为 NOT NULLNOT LIKE '%INNODB_TABLES%' 的页面数量,提供包含用户数据的页面的大致计数。

mysql> SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NOT NULL AND TABLE_NAME NOT LIKE '%INNODB_TABLES%';
+----------+
| COUNT(*) |
+----------+
|     7897 |
+----------+

此查询返回包含用户数据的页面的大致数量,缓冲池页面的总数,以及包含用户数据的页面的大致百分比。

mysql> SELECT
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NOT NULL AND (INSTR(TABLE_NAME, '/') > 0 OR INSTR(TABLE_NAME, '.') > 0)
       ) AS user_pages,
       (
       SELECT COUNT(*)
       FROM information_schema.INNODB_BUFFER_PAGE
       ) AS total_pages,
       (
       SELECT ROUND((user_pages/total_pages) * 100)
       ) AS user_page_percentage;
+------------+-------------+----------------------+
| user_pages | total_pages | user_page_percentage |
+------------+-------------+----------------------+
|       7897 |        8192 |                   96 |
+------------+-------------+----------------------+

此查询标识具有缓冲池中页面的用户定义表:

mysql> SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NOT NULL AND (INSTR(TABLE_NAME, '/') > 0 OR INSTR(TABLE_NAME, '.') > 0)
       AND TABLE_NAME NOT LIKE '`mysql`.`innodb_%';
+-------------------------+
| TABLE_NAME              |
+-------------------------+
| `employees`.`salaries`  |
| `employees`.`employees` |
+-------------------------+

示例 17.8 在 INNODB_BUFFER_PAGE 表中查询索引数据

要了解索引页面的信息,请使用索引的名称查询 INDEX_NAME 列。例如,以下查询返回了在 employees.salaries 表上定义的 emp_no 索引的页面数量和页面的总数据大小:

mysql> SELECT INDEX_NAME, COUNT(*) AS Pages,
ROUND(SUM(IF(COMPRESSED_SIZE = 0, @@GLOBAL.innodb_page_size, COMPRESSED_SIZE))/1024/1024)
AS 'Total Data (MB)'
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE INDEX_NAME='emp_no' AND TABLE_NAME = '`employees`.`salaries`';
+------------+-------+-----------------+
| INDEX_NAME | Pages | Total Data (MB) |
+------------+-------+-----------------+
| emp_no     |  1609 |              25 |
+------------+-------+-----------------+

此查询返回了在 employees.salaries 表上定义的所有索引的页面数量和页面的总数据大小:

mysql> SELECT INDEX_NAME, COUNT(*) AS Pages,
       ROUND(SUM(IF(COMPRESSED_SIZE = 0, @@GLOBAL.innodb_page_size, COMPRESSED_SIZE))/1024/1024)
       AS 'Total Data (MB)'
       FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME = '`employees`.`salaries`'
       GROUP BY INDEX_NAME;
+------------+-------+-----------------+
| INDEX_NAME | Pages | Total Data (MB) |
+------------+-------+-----------------+
| emp_no     |  1608 |              25 |
| PRIMARY    |  6086 |              95 |
+------------+-------+-----------------+

示例 17.9 在 INNODB_BUFFER_PAGE_LRU 表中查询 LRU_POSITION 数据

INNODB_BUFFER_PAGE_LRU 表包含关于 InnoDB 缓冲池中页面的信息,特别是它们的排序方式,确定了在缓冲池变满时应该驱逐哪些页面。该页面的定义与 INNODB_BUFFER_PAGE 相同,只是该表具有一个 LRU_POSITION 列而不是一个 BLOCK_ID 列。

此查询计算了 employees.employees 表页面在 LRU 列中特定位置上所占的位置数。

mysql> SELECT COUNT(LRU_POSITION) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU
       WHERE TABLE_NAME='`employees`.`employees`' AND LRU_POSITION < 3072;
+---------------------+
| COUNT(LRU_POSITION) |
+---------------------+
|                 548 |
+---------------------+

示例 17.10 查询 INNODB_BUFFER_POOL_STATS 表

INNODB_BUFFER_POOL_STATS 表提供类似于 SHOW ENGINE INNODB STATUSInnoDB 缓冲池状态变量的信息。

mysql> SELECT * FROM information_schema.INNODB_BUFFER_POOL_STATS \G
*************************** 1\. row ***************************
                         POOL_ID: 0
                       POOL_SIZE: 8192
                    FREE_BUFFERS: 1
                  DATABASE_PAGES: 8173
              OLD_DATABASE_PAGES: 3014
         MODIFIED_DATABASE_PAGES: 0
              PENDING_DECOMPRESS: 0
                   PENDING_READS: 0
               PENDING_FLUSH_LRU: 0
              PENDING_FLUSH_LIST: 0
                PAGES_MADE_YOUNG: 15907
            PAGES_NOT_MADE_YOUNG: 3803101
           PAGES_MADE_YOUNG_RATE: 0
       PAGES_MADE_NOT_YOUNG_RATE: 0
               NUMBER_PAGES_READ: 3270
            NUMBER_PAGES_CREATED: 13176
            NUMBER_PAGES_WRITTEN: 15109
                 PAGES_READ_RATE: 0
               PAGES_CREATE_RATE: 0
              PAGES_WRITTEN_RATE: 0
                NUMBER_PAGES_GET: 33069332
                        HIT_RATE: 0
    YOUNG_MAKE_PER_THOUSAND_GETS: 0
NOT_YOUNG_MAKE_PER_THOUSAND_GETS: 0
         NUMBER_PAGES_READ_AHEAD: 2713
       NUMBER_READ_AHEAD_EVICTED: 0
                 READ_AHEAD_RATE: 0
         READ_AHEAD_EVICTED_RATE: 0
                    LRU_IO_TOTAL: 0
                  LRU_IO_CURRENT: 0
                UNCOMPRESS_TOTAL: 0
              UNCOMPRESS_CURRENT: 0

为了比较起见,以下是基于相同数据集的 SHOW ENGINE INNODB STATUS 输出和 InnoDB 缓冲池状态变量输出。

要了解有关 SHOW ENGINE INNODB STATUS 输出的更多信息,请参阅 第 17.17.3 节,“InnoDB 标准监视器和锁监视器输出”。

mysql> SHOW ENGINE INNODB STATUS \G
...
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 579084
Buffer pool size   8192
Free buffers       1
Database pages     8173
Old database pages 3014
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 15907, not young 3803101
0.00 youngs/s, 0.00 non-youngs/s
Pages read 3270, created 13176, written 15109
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 8173, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
...

对于状态变量的描述,请参见第 7.1.10 节,“服务器状态变量”。

mysql> SHOW STATUS LIKE 'Innodb_buffer%';
+---------------------------------------+-------------+
| Variable_name                         | Value       |
+---------------------------------------+-------------+
| Innodb_buffer_pool_dump_status        | not started |
| Innodb_buffer_pool_load_status        | not started |
| Innodb_buffer_pool_resize_status      | not started |
| Innodb_buffer_pool_pages_data         | 8173        |
| Innodb_buffer_pool_bytes_data         | 133906432   |
| Innodb_buffer_pool_pages_dirty        | 0           |
| Innodb_buffer_pool_bytes_dirty        | 0           |
| Innodb_buffer_pool_pages_flushed      | 15109       |
| Innodb_buffer_pool_pages_free         | 1           |
| Innodb_buffer_pool_pages_misc         | 18          |
| Innodb_buffer_pool_pages_total        | 8192        |
| Innodb_buffer_pool_read_ahead_rnd     | 0           |
| Innodb_buffer_pool_read_ahead         | 2713        |
| Innodb_buffer_pool_read_ahead_evicted | 0           |
| Innodb_buffer_pool_read_requests      | 33069332    |
| Innodb_buffer_pool_reads              | 558         |
| Innodb_buffer_pool_wait_free          | 0           |
| Innodb_buffer_pool_write_requests     | 11985961    |
+---------------------------------------+-------------+

17.15.6 InnoDB INFORMATION_SCHEMA Metrics 表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-metrics-table.html

INNODB_METRICS 表提供关于 InnoDB 性能和资源相关计数器的信息。

INNODB_METRICS 表列如下。有关列描述,请参见 Section 28.4.21, “INFORMATION_SCHEMA INNODB_METRICS 表”。

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts" \G
*************************** 1\. row ***************************
           NAME: dml_inserts
      SUBSYSTEM: dml
          COUNT: 46273
      MAX_COUNT: 46273
      MIN_COUNT: NULL
      AVG_COUNT: 492.2659574468085
    COUNT_RESET: 46273
MAX_COUNT_RESET: 46273
MIN_COUNT_RESET: NULL
AVG_COUNT_RESET: NULL
   TIME_ENABLED: 2014-11-28 16:07:53
  TIME_DISABLED: NULL
   TIME_ELAPSED: 94
     TIME_RESET: NULL
         STATUS: enabled
           TYPE: status_counter
        COMMENT: Number of rows inserted

启用、禁用和重置计数器

您可以使用以下变量启用、禁用和重置计数器:

  • innodb_monitor_enable: 启用计数器。

    SET GLOBAL innodb_monitor_enable = [counter-name|module_name|pattern|all];
    
  • innodb_monitor_disable: 禁用计数器。

    SET GLOBAL innodb_monitor_disable = [counter-name|module_name|pattern|all];
    
  • innodb_monitor_reset: 将计数器值重置为零。

    SET GLOBAL innodb_monitor_reset = [counter-name|module_name|pattern|all];
    
  • innodb_monitor_reset_all: 重置所有计数器值。在使用 innodb_monitor_reset_all 之前,必须禁用计数器。

    SET GLOBAL innodb_monitor_reset_all = [counter-name|module_name|pattern|all];
    

计数器和计数器模块也可以在启动时使用 MySQL 服务器配置文件启用。例如,要启用 log 模块,metadata_table_handles_openedmetadata_table_handles_closed 计数器,在 MySQL 服务器配置文件的 [mysqld] 部分中输入以下行。

[mysqld]
innodb_monitor_enable = log,metadata_table_handles_opened,metadata_table_handles_closed

在配置文件中启用多个计数器或模块时,请指定 innodb_monitor_enable 变量,后跟以逗号分隔的计数器和模块名称,如上所示。只能在配置文件中使用 innodb_monitor_enable 变量。innodb_monitor_disableinnodb_monitor_reset 变量仅在命令行上受支持。

注意

由于每个计数器都会增加运行时开销,建议在生产服务器上谨慎使用计数器来诊断特定问题或监视特定功能。建议在测试或开发服务器上更广泛地使用计数器。

计数器

可用计数器列表可能会更改。查询信息模式 INNODB_METRICS 表,以获��您的 MySQL 服务器版本中可用的计数器。

默认启用的计数器对应于 SHOW ENGINE INNODB STATUS 输出中显示的计数器。在 SHOW ENGINE INNODB STATUS 输出中显示的计数器始终在系统级别启用,但可以在 INNODB_METRICS 表中禁用。计数器状态不是持久的。除非另有配置,否则在服务器重新启动时,计数器会恢复到它们的默认启用或禁用状态。

如果您运行的程序会受到计数器的添加或移除影响,建议您查看发布说明并查询 INNODB_METRICS 表,以识别这些更改作为升级过程的一部分。

mysql> SELECT name, subsystem, status FROM INFORMATION_SCHEMA.INNODB_METRICS ORDER BY NAME;
+---------------------------------------------+---------------------+----------+
| name                                        | subsystem           | status   |
+---------------------------------------------+---------------------+----------+
| adaptive_hash_pages_added                   | adaptive_hash_index | disabled |
| adaptive_hash_pages_removed                 | adaptive_hash_index | disabled |
| adaptive_hash_rows_added                    | adaptive_hash_index | disabled |
| adaptive_hash_rows_deleted_no_hash_entry    | adaptive_hash_index | disabled |
| adaptive_hash_rows_removed                  | adaptive_hash_index | disabled |
| adaptive_hash_rows_updated                  | adaptive_hash_index | disabled |
| adaptive_hash_searches                      | adaptive_hash_index | enabled  |
| adaptive_hash_searches_btree                | adaptive_hash_index | enabled  |
| buffer_data_reads                           | buffer              | enabled  |
| buffer_data_written                         | buffer              | enabled  |
| buffer_flush_adaptive                       | buffer              | disabled |
| buffer_flush_adaptive_avg_pass              | buffer              | disabled |
| buffer_flush_adaptive_avg_time_est          | buffer              | disabled |
| buffer_flush_adaptive_avg_time_slot         | buffer              | disabled |
| buffer_flush_adaptive_avg_time_thread       | buffer              | disabled |
| buffer_flush_adaptive_pages                 | buffer              | disabled |
| buffer_flush_adaptive_total_pages           | buffer              | disabled |
| buffer_flush_avg_page_rate                  | buffer              | disabled |
| buffer_flush_avg_pass                       | buffer              | disabled |
| buffer_flush_avg_time                       | buffer              | disabled |
| buffer_flush_background                     | buffer              | disabled |
| buffer_flush_background_pages               | buffer              | disabled |
| buffer_flush_background_total_pages         | buffer              | disabled |
| buffer_flush_batches                        | buffer              | disabled |
| buffer_flush_batch_num_scan                 | buffer              | disabled |
| buffer_flush_batch_pages                    | buffer              | disabled |
| buffer_flush_batch_scanned                  | buffer              | disabled |
| buffer_flush_batch_scanned_per_call         | buffer              | disabled |
| buffer_flush_batch_total_pages              | buffer              | disabled |
| buffer_flush_lsn_avg_rate                   | buffer              | disabled |
| buffer_flush_neighbor                       | buffer              | disabled |
| buffer_flush_neighbor_pages                 | buffer              | disabled |
| buffer_flush_neighbor_total_pages           | buffer              | disabled |
| buffer_flush_n_to_flush_by_age              | buffer              | disabled |
| buffer_flush_n_to_flush_by_dirty_page       | buffer              | disabled |
| buffer_flush_n_to_flush_requested           | buffer              | disabled |
| buffer_flush_pct_for_dirty                  | buffer              | disabled |
| buffer_flush_pct_for_lsn                    | buffer              | disabled |
| buffer_flush_sync                           | buffer              | disabled |
| buffer_flush_sync_pages                     | buffer              | disabled |
| buffer_flush_sync_total_pages               | buffer              | disabled |
| buffer_flush_sync_waits                     | buffer              | disabled |
| buffer_LRU_batches_evict                    | buffer              | disabled |
| buffer_LRU_batches_flush                    | buffer              | disabled |
| buffer_LRU_batch_evict_pages                | buffer              | disabled |
| buffer_LRU_batch_evict_total_pages          | buffer              | disabled |
| buffer_LRU_batch_flush_avg_pass             | buffer              | disabled |
| buffer_LRU_batch_flush_avg_time_est         | buffer              | disabled |
| buffer_LRU_batch_flush_avg_time_slot        | buffer              | disabled |
| buffer_LRU_batch_flush_avg_time_thread      | buffer              | disabled |
| buffer_LRU_batch_flush_pages                | buffer              | disabled |
| buffer_LRU_batch_flush_total_pages          | buffer              | disabled |
| buffer_LRU_batch_num_scan                   | buffer              | disabled |
| buffer_LRU_batch_scanned                    | buffer              | disabled |
| buffer_LRU_batch_scanned_per_call           | buffer              | disabled |
| buffer_LRU_get_free_loops                   | buffer              | disabled |
| buffer_LRU_get_free_search                  | Buffer              | disabled |
| buffer_LRU_get_free_waits                   | buffer              | disabled |
| buffer_LRU_search_num_scan                  | buffer              | disabled |
| buffer_LRU_search_scanned                   | buffer              | disabled |
| buffer_LRU_search_scanned_per_call          | buffer              | disabled |
| buffer_LRU_single_flush_failure_count       | Buffer              | disabled |
| buffer_LRU_single_flush_num_scan            | buffer              | disabled |
| buffer_LRU_single_flush_scanned             | buffer              | disabled |
| buffer_LRU_single_flush_scanned_per_call    | buffer              | disabled |
| buffer_LRU_unzip_search_num_scan            | buffer              | disabled |
| buffer_LRU_unzip_search_scanned             | buffer              | disabled |
| buffer_LRU_unzip_search_scanned_per_call    | buffer              | disabled |
| buffer_pages_created                        | buffer              | enabled  |
| buffer_pages_read                           | buffer              | enabled  |
| buffer_pages_written                        | buffer              | enabled  |
| buffer_page_read_blob                       | buffer_page_io      | disabled |
| buffer_page_read_fsp_hdr                    | buffer_page_io      | disabled |
| buffer_page_read_ibuf_bitmap                | buffer_page_io      | disabled |
| buffer_page_read_ibuf_free_list             | buffer_page_io      | disabled |
| buffer_page_read_index_ibuf_leaf            | buffer_page_io      | disabled |
| buffer_page_read_index_ibuf_non_leaf        | buffer_page_io      | disabled |
| buffer_page_read_index_inode                | buffer_page_io      | disabled |
| buffer_page_read_index_leaf                 | buffer_page_io      | disabled |
| buffer_page_read_index_non_leaf             | buffer_page_io      | disabled |
| buffer_page_read_other                      | buffer_page_io      | disabled |
| buffer_page_read_rseg_array                 | buffer_page_io      | disabled |
| buffer_page_read_system_page                | buffer_page_io      | disabled |
| buffer_page_read_trx_system                 | buffer_page_io      | disabled |
| buffer_page_read_undo_log                   | buffer_page_io      | disabled |
| buffer_page_read_xdes                       | buffer_page_io      | disabled |
| buffer_page_read_zblob                      | buffer_page_io      | disabled |
| buffer_page_read_zblob2                     | buffer_page_io      | disabled |
| buffer_page_written_blob                    | buffer_page_io      | disabled |
| buffer_page_written_fsp_hdr                 | buffer_page_io      | disabled |
| buffer_page_written_ibuf_bitmap             | buffer_page_io      | disabled |
| buffer_page_written_ibuf_free_list          | buffer_page_io      | disabled |
| buffer_page_written_index_ibuf_leaf         | buffer_page_io      | disabled |
| buffer_page_written_index_ibuf_non_leaf     | buffer_page_io      | disabled |
| buffer_page_written_index_inode             | buffer_page_io      | disabled |
| buffer_page_written_index_leaf              | buffer_page_io      | disabled |
| buffer_page_written_index_non_leaf          | buffer_page_io      | disabled |
| buffer_page_written_on_log_no_waits         | buffer_page_io      | disabled |
| buffer_page_written_on_log_waits            | buffer_page_io      | disabled |
| buffer_page_written_on_log_wait_loops       | buffer_page_io      | disabled |
| buffer_page_written_other                   | buffer_page_io      | disabled |
| buffer_page_written_rseg_array              | buffer_page_io      | disabled |
| buffer_page_written_system_page             | buffer_page_io      | disabled |
| buffer_page_written_trx_system              | buffer_page_io      | disabled |
| buffer_page_written_undo_log                | buffer_page_io      | disabled |
| buffer_page_written_xdes                    | buffer_page_io      | disabled |
| buffer_page_written_zblob                   | buffer_page_io      | disabled |
| buffer_page_written_zblob2                  | buffer_page_io      | disabled |
| buffer_pool_bytes_data                      | buffer              | enabled  |
| buffer_pool_bytes_dirty                     | buffer              | enabled  |
| buffer_pool_pages_data                      | buffer              | enabled  |
| buffer_pool_pages_dirty                     | buffer              | enabled  |
| buffer_pool_pages_free                      | buffer              | enabled  |
| buffer_pool_pages_misc                      | buffer              | enabled  |
| buffer_pool_pages_total                     | buffer              | enabled  |
| buffer_pool_reads                           | buffer              | enabled  |
| buffer_pool_read_ahead                      | buffer              | enabled  |
| buffer_pool_read_ahead_evicted              | buffer              | enabled  |
| buffer_pool_read_requests                   | buffer              | enabled  |
| buffer_pool_size                            | server              | enabled  |
| buffer_pool_wait_free                       | buffer              | enabled  |
| buffer_pool_write_requests                  | buffer              | enabled  |
| compression_pad_decrements                  | compression         | disabled |
| compression_pad_increments                  | compression         | disabled |
| compress_pages_compressed                   | compression         | disabled |
| compress_pages_decompressed                 | compression         | disabled |
| cpu_n                                       | cpu                 | disabled |
| cpu_stime_abs                               | cpu                 | disabled |
| cpu_stime_pct                               | cpu                 | disabled |
| cpu_utime_abs                               | cpu                 | disabled |
| cpu_utime_pct                               | cpu                 | disabled |
| dblwr_async_requests                        | dblwr               | disabled |
| dblwr_flush_requests                        | dblwr               | disabled |
| dblwr_flush_wait_events                     | dblwr               | disabled |
| dblwr_sync_requests                         | dblwr               | disabled |
| ddl_background_drop_tables                  | ddl                 | disabled |
| ddl_log_file_alter_table                    | ddl                 | disabled |
| ddl_online_create_index                     | ddl                 | disabled |
| ddl_pending_alter_table                     | ddl                 | disabled |
| ddl_sort_file_alter_table                   | ddl                 | disabled |
| dml_deletes                                 | dml                 | enabled  |
| dml_inserts                                 | dml                 | enabled  |
| dml_reads                                   | dml                 | disabled |
| dml_system_deletes                          | dml                 | enabled  |
| dml_system_inserts                          | dml                 | enabled  |
| dml_system_reads                            | dml                 | enabled  |
| dml_system_updates                          | dml                 | enabled  |
| dml_updates                                 | dml                 | enabled  |
| file_num_open_files                         | file_system         | enabled  |
| ibuf_merges                                 | change_buffer       | enabled  |
| ibuf_merges_delete                          | change_buffer       | enabled  |
| ibuf_merges_delete_mark                     | change_buffer       | enabled  |
| ibuf_merges_discard_delete                  | change_buffer       | enabled  |
| ibuf_merges_discard_delete_mark             | change_buffer       | enabled  |
| ibuf_merges_discard_insert                  | change_buffer       | enabled  |
| ibuf_merges_insert                          | change_buffer       | enabled  |
| ibuf_size                                   | change_buffer       | enabled  |
| icp_attempts                                | icp                 | disabled |
| icp_match                                   | icp                 | disabled |
| icp_no_match                                | icp                 | disabled |
| icp_out_of_range                            | icp                 | disabled |
| index_page_discards                         | index               | disabled |
| index_page_merge_attempts                   | index               | disabled |
| index_page_merge_successful                 | index               | disabled |
| index_page_reorg_attempts                   | index               | disabled |
| index_page_reorg_successful                 | index               | disabled |
| index_page_splits                           | index               | disabled |
| innodb_activity_count                       | server              | enabled  |
| innodb_background_drop_table_usec           | server              | disabled |
| innodb_dblwr_pages_written                  | server              | enabled  |
| innodb_dblwr_writes                         | server              | enabled  |
| innodb_dict_lru_count                       | server              | disabled |
| innodb_dict_lru_usec                        | server              | disabled |
| innodb_ibuf_merge_usec                      | server              | disabled |
| innodb_master_active_loops                  | server              | disabled |
| innodb_master_idle_loops                    | server              | disabled |
| innodb_master_purge_usec                    | server              | disabled |
| innodb_master_thread_sleeps                 | server              | disabled |
| innodb_mem_validate_usec                    | server              | disabled |
| innodb_page_size                            | server              | enabled  |
| innodb_rwlock_sx_os_waits                   | server              | enabled  |
| innodb_rwlock_sx_spin_rounds                | server              | enabled  |
| innodb_rwlock_sx_spin_waits                 | server              | enabled  |
| innodb_rwlock_s_os_waits                    | server              | enabled  |
| innodb_rwlock_s_spin_rounds                 | server              | enabled  |
| innodb_rwlock_s_spin_waits                  | server              | enabled  |
| innodb_rwlock_x_os_waits                    | server              | enabled  |
| innodb_rwlock_x_spin_rounds                 | server              | enabled  |
| innodb_rwlock_x_spin_waits                  | server              | enabled  |
| lock_deadlocks                              | lock                | enabled  |
| lock_deadlock_false_positives               | lock                | enabled  |
| lock_deadlock_rounds                        | lock                | enabled  |
| lock_rec_grant_attempts                     | lock                | enabled  |
| lock_rec_locks                              | lock                | disabled |
| lock_rec_lock_created                       | lock                | disabled |
| lock_rec_lock_removed                       | lock                | disabled |
| lock_rec_lock_requests                      | lock                | disabled |
| lock_rec_lock_waits                         | lock                | disabled |
| lock_rec_release_attempts                   | lock                | enabled  |
| lock_row_lock_current_waits                 | lock                | enabled  |
| lock_row_lock_time                          | lock                | enabled  |
| lock_row_lock_time_avg                      | lock                | enabled  |
| lock_row_lock_time_max                      | lock                | enabled  |
| lock_row_lock_waits                         | lock                | enabled  |
| lock_schedule_refreshes                     | lock                | enabled  |
| lock_table_locks                            | lock                | disabled |
| lock_table_lock_created                     | lock                | disabled |
| lock_table_lock_removed                     | lock                | disabled |
| lock_table_lock_waits                       | lock                | disabled |
| lock_threads_waiting                        | lock                | enabled  |
| lock_timeouts                               | lock                | enabled  |
| log_checkpoints                             | log                 | disabled |
| log_concurrency_margin                      | log                 | disabled |
| log_flusher_no_waits                        | log                 | disabled |
| log_flusher_waits                           | log                 | disabled |
| log_flusher_wait_loops                      | log                 | disabled |
| log_flush_avg_time                          | log                 | disabled |
| log_flush_lsn_avg_rate                      | log                 | disabled |
| log_flush_max_time                          | log                 | disabled |
| log_flush_notifier_no_waits                 | log                 | disabled |
| log_flush_notifier_waits                    | log                 | disabled |
| log_flush_notifier_wait_loops               | log                 | disabled |
| log_flush_total_time                        | log                 | disabled |
| log_free_space                              | log                 | disabled |
| log_full_block_writes                       | log                 | disabled |
| log_lsn_archived                            | log                 | disabled |
| log_lsn_buf_dirty_pages_added               | log                 | disabled |
| log_lsn_buf_pool_oldest_approx              | log                 | disabled |
| log_lsn_buf_pool_oldest_lwm                 | log                 | disabled |
| log_lsn_checkpoint_age                      | log                 | disabled |
| log_lsn_current                             | log                 | disabled |
| log_lsn_last_checkpoint                     | log                 | disabled |
| log_lsn_last_flush                          | log                 | disabled |
| log_max_modified_age_async                  | log                 | disabled |
| log_max_modified_age_sync                   | log                 | disabled |
| log_next_file                               | log                 | disabled |
| log_on_buffer_space_no_waits                | log                 | disabled |
| log_on_buffer_space_waits                   | log                 | disabled |
| log_on_buffer_space_wait_loops              | log                 | disabled |
| log_on_file_space_no_waits                  | log                 | disabled |
| log_on_file_space_waits                     | log                 | disabled |
| log_on_file_space_wait_loops                | log                 | disabled |
| log_on_flush_no_waits                       | log                 | disabled |
| log_on_flush_waits                          | log                 | disabled |
| log_on_flush_wait_loops                     | log                 | disabled |
| log_on_recent_closed_wait_loops             | log                 | disabled |
| log_on_recent_written_wait_loops            | log                 | disabled |
| log_on_write_no_waits                       | log                 | disabled |
| log_on_write_waits                          | log                 | disabled |
| log_on_write_wait_loops                     | log                 | disabled |
| log_padded                                  | log                 | disabled |
| log_partial_block_writes                    | log                 | disabled |
| log_waits                                   | log                 | enabled  |
| log_writer_no_waits                         | log                 | disabled |
| log_writer_on_archiver_waits                | log                 | disabled |
| log_writer_on_file_space_waits              | log                 | disabled |
| log_writer_waits                            | log                 | disabled |
| log_writer_wait_loops                       | log                 | disabled |
| log_writes                                  | log                 | enabled  |
| log_write_notifier_no_waits                 | log                 | disabled |
| log_write_notifier_waits                    | log                 | disabled |
| log_write_notifier_wait_loops               | log                 | disabled |
| log_write_requests                          | log                 | enabled  |
| log_write_to_file_requests_interval         | log                 | disabled |
| metadata_table_handles_closed               | metadata            | disabled |
| metadata_table_handles_opened               | metadata            | disabled |
| metadata_table_reference_count              | metadata            | disabled |
| module_cpu                                  | cpu                 | disabled |
| module_dblwr                                | dblwr               | disabled |
| module_page_track                           | page_track          | disabled |
| os_data_fsyncs                              | os                  | enabled  |
| os_data_reads                               | os                  | enabled  |
| os_data_writes                              | os                  | enabled  |
| os_log_bytes_written                        | os                  | enabled  |
| os_log_fsyncs                               | os                  | enabled  |
| os_log_pending_fsyncs                       | os                  | enabled  |
| os_log_pending_writes                       | os                  | enabled  |
| os_pending_reads                            | os                  | disabled |
| os_pending_writes                           | os                  | disabled |
| page_track_checkpoint_partial_flush_request | page_track          | disabled |
| page_track_full_block_writes                | page_track          | disabled |
| page_track_partial_block_writes             | page_track          | disabled |
| page_track_resets                           | page_track          | disabled |
| purge_del_mark_records                      | purge               | disabled |
| purge_dml_delay_usec                        | purge               | disabled |
| purge_invoked                               | purge               | disabled |
| purge_resume_count                          | purge               | disabled |
| purge_stop_count                            | purge               | disabled |
| purge_truncate_history_count                | purge               | disabled |
| purge_truncate_history_usec                 | purge               | disabled |
| purge_undo_log_pages                        | purge               | disabled |
| purge_upd_exist_or_extern_records           | purge               | disabled |
| sampled_pages_read                          | sampling            | disabled |
| sampled_pages_skipped                       | sampling            | disabled |
| trx_active_transactions                     | transaction         | disabled |
| trx_allocations                             | transaction         | disabled |
| trx_commits_insert_update                   | transaction         | disabled |
| trx_nl_ro_commits                           | transaction         | disabled |
| trx_on_log_no_waits                         | transaction         | disabled |
| trx_on_log_waits                            | transaction         | disabled |
| trx_on_log_wait_loops                       | transaction         | disabled |
| trx_rollbacks                               | transaction         | disabled |
| trx_rollbacks_savepoint                     | transaction         | disabled |
| trx_rollback_active                         | transaction         | disabled |
| trx_ro_commits                              | transaction         | disabled |
| trx_rseg_current_size                       | transaction         | disabled |
| trx_rseg_history_len                        | transaction         | enabled  |
| trx_rw_commits                              | transaction         | disabled |
| trx_undo_slots_cached                       | transaction         | disabled |
| trx_undo_slots_used                         | transaction         | disabled |
| undo_truncate_count                         | undo                | disabled |
| undo_truncate_done_logging_count            | undo                | disabled |
| undo_truncate_start_logging_count           | undo                | disabled |
| undo_truncate_usec                          | undo                | disabled |
+---------------------------------------------+---------------------+----------+
314 rows in set (0.00 sec)

计数器模块

每个计数器与特定模块相关联。模块名称可用于启用、禁用或重置特定子系统的所有计数器。例如,使用 module_dml 可以启��与 dml 子系统相关的所有计数器。

mysql> SET GLOBAL innodb_monitor_enable = module_dml;

mysql> SELECT name, subsystem, status FROM INFORMATION_SCHEMA.INNODB_METRICS
       WHERE subsystem ='dml';
+-------------+-----------+---------+
| name        | subsystem | status  |
+-------------+-----------+---------+
| dml_reads   | dml       | enabled |
| dml_inserts | dml       | enabled |
| dml_deletes | dml       | enabled |
| dml_updates | dml       | enabled |
+-------------+-----------+---------+

模块名称可与 innodb_monitor_enable 和相关变量一起使用。

模块名称及其对应的 SUBSYSTEM 名称如下。

  • module_adaptive_hash (subsystem = adaptive_hash_index)

  • module_buffer (subsystem = buffer)

  • module_buffer_page (subsystem = buffer_page_io)

  • module_compress (subsystem = compression)

  • module_ddl (subsystem = ddl)

  • module_dml (subsystem = dml)

  • module_file (subsystem = file_system)

  • module_ibuf_system (subsystem = change_buffer)

  • module_icp (subsystem = icp)

  • module_index (subsystem = index)

  • module_innodb (subsystem = innodb)

  • module_lock (subsystem = lock)

  • module_log (subsystem = log)

  • module_metadata (subsystem = metadata)

  • module_os (subsystem = os)

  • module_purge (subsystem = purge)

  • module_trx (subsystem = transaction)

  • module_undo (subsystem = undo)

示例 17.11 使用 INNODB_METRICS 表计数器

本示例演示了启用、禁用和重置计数器,并在 INNODB_METRICS 表中查询计数器数据。

  1. 创建一个简单的 InnoDB 表:

    mysql> USE test;
    Database changed
    
    mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
    Query OK, 0 rows affected (0.02 sec)
    
  2. 启用 dml_inserts 计数器。

    mysql> SET GLOBAL innodb_monitor_enable = dml_inserts;
    Query OK, 0 rows affected (0.01 sec)
    

    INNODB_METRICS 表的 COMMENT 列中可以找到 dml_inserts 计数器的描述:

    mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts";
    +-------------+-------------------------+
    | NAME        | COMMENT                 |
    +-------------+-------------------------+
    | dml_inserts | Number of rows inserted |
    +-------------+-------------------------+
    
  3. 查询 dml_inserts 计数器数据的 INNODB_METRICS 表。因为没有执行 DML 操作,计数器值为零或 NULL。TIME_ENABLEDTIME_ELAPSED 值指示计数器上次启用的时间以及自那时经过的秒数。

    mysql>  SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts" \G
    *************************** 1\. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 0
          MAX_COUNT: 0
          MIN_COUNT: NULL
          AVG_COUNT: 0
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: NULL
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: NULL
       TIME_ELAPSED: 28
         TIME_RESET: NULL
             STATUS: enabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
  4. 向表中插入三行数据。

    mysql> INSERT INTO t1 values(1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO t1 values(2);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO t1 values(3);
    Query OK, 1 row affected (0.00 sec)
    
  5. 再次查询INNODB_METRICS表以获取dml_inserts计数器数据。现在已经增加了许多计数器值,包括COUNTMAX_COUNTAVG_COUNTCOUNT_RESET。请参考INNODB_METRICS表定义,了解这些值的描述。

    mysql>  SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1\. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 3
          MAX_COUNT: 3
          MIN_COUNT: NULL
          AVG_COUNT: 0.046153846153846156
        COUNT_RESET: 3
    MAX_COUNT_RESET: 3
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: NULL
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: NULL
       TIME_ELAPSED: 65
         TIME_RESET: NULL
             STATUS: enabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
  6. 重置dml_inserts计数器,并再次查询INNODB_METRICS表以获取dml_inserts计数器数据。先前报告的%_RESET值,如COUNT_RESETMAX_RESET,将被设置为零。像COUNTMAX_COUNTAVG_COUNT这样的值,从启用计数器开始累积收集数据,不受重置影响。

    mysql> SET GLOBAL innodb_monitor_reset = dml_inserts;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1\. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 3
          MAX_COUNT: 3
          MIN_COUNT: NULL
          AVG_COUNT: 0.03529411764705882
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: 0
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: NULL
       TIME_ELAPSED: 85
         TIME_RESET: 2014-12-04 14:19:44
             STATUS: enabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
  7. 要重置所有计数器值,必须先禁用计数器。禁用计数器会将STATUS值设置为disabled

    mysql> SET GLOBAL innodb_monitor_disable = dml_inserts;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1\. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 3
          MAX_COUNT: 3
          MIN_COUNT: NULL
          AVG_COUNT: 0.030612244897959183
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: 0
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: 2014-12-04 14:20:06
       TIME_ELAPSED: 98
         TIME_RESET: NULL
             STATUS: disabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    

    注意

    计数器和模块名称支持通配符匹配。例如,可以指定dml_i%而不是完整的dml_inserts计数器名称。还可以使用通配符匹配一次性启用、禁用或重置多个计数器或模块。例如,指定dml_%以启用、禁用或重置所有以dml_开头的计数器。

  8. 在禁用计数器后,可以使用innodb_monitor_reset_all选项重置所有计数器值。所有值都设置为零或 NULL。

    mysql> SET GLOBAL innodb_monitor_reset_all = dml_inserts;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1\. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 0
          MAX_COUNT: NULL
          MIN_COUNT: NULL
          AVG_COUNT: NULL
        COUNT_RESET: 0
    MAX_COUNT_RESET: NULL
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: NULL
       TIME_ENABLED: NULL
      TIME_DISABLED: NULL
       TIME_ELAPSED: NULL
         TIME_RESET: NULL
             STATUS: disabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    

17.15.7 InnoDB INFORMATION_SCHEMA 临时表信息表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-temp-table-info.html

INNODB_TEMP_TABLE_INFO提供有关活动在InnoDB实例中的用户创建的InnoDB临时表的信息。它不提供有关优化器使用的内部InnoDB临时表的信息。

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_TEMP%';
+---------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_TEMP%) |
+---------------------------------------------+
| INNODB_TEMP_TABLE_INFO                      |
+---------------------------------------------+

有关表定义,请参见第 28.4.27 节,“INFORMATION_SCHEMA INNODB_TEMP_TABLE_INFO 表”。

示例 17.12 INNODB_TEMP_TABLE_INFO

此示例演示了INNODB_TEMP_TABLE_INFO表的特性。

  1. 创建一个简单的InnoDB临时表:

    mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
    
  2. 查询INNODB_TEMP_TABLE_INFO以查看临时表元数据。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G
    *************************** 1\. row ***************************
                TABLE_ID: 194
                    NAME: #sql7a79_1_0
                  N_COLS: 4
                   SPACE: 182
    

    TABLE_ID是临时表的唯一标识符。NAME列显示临时表的系统生成名称,前缀为“#sql”。列数(N_COLS)为 4,而不是 1,因为InnoDB始终创建三个隐藏表列(DB_ROW_IDDB_TRX_IDDB_ROLL_PTR)。

  3. 重启 MySQL 并查询INNODB_TEMP_TABLE_INFO

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G
    

    返回一个空集,因为当服务器关闭时,INNODB_TEMP_TABLE_INFO及其数据不会持久保存到磁盘。

  4. 创建一个新的临时表。

    mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
    
  5. 查询INNODB_TEMP_TABLE_INFO以查看临时表元数据。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G
    *************************** 1\. row ***************************
                TABLE_ID: 196
                    NAME: #sql7b0e_1_0
                  N_COLS: 4
                   SPACE: 184
    

    SPACE ID 可能不同,因为它在服务器启动时动态生成。

17.15.8 从 INFORMATION_SCHEMA.FILES 检索 InnoDB 表空间元数据

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-files-table.html

信息模式FILES表提供有关所有InnoDB表空间类型的元数据,包括 file-per-table tablespaces、general tablespaces、system tablespace、temporary table tablespaces 和 undo tablespaces(如果存在)。

本节提供了InnoDB特定的用法示例。有关信息模式FILES表提供的数据的更多信息,请参阅 Section 28.3.15, “INFORMATION_SCHEMA FILES 表”。

注意

INNODB_TABLESPACESINNODB_DATAFILES表还提供有关InnoDB表空间的元数据,但数据仅限于文件表、一般表和撤销表空间。

此查询从与InnoDB表空间相关的信息模式FILES表的字段中检索有关InnoDB系统表空间的元数据。与InnoDB不相关的FILES列始终返回NULL,并且在查询中被排除。

mysql> SELECT FILE_ID, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, FREE_EXTENTS,
       TOTAL_EXTENTS,  EXTENT_SIZE, INITIAL_SIZE, MAXIMUM_SIZE, AUTOEXTEND_SIZE, DATA_FREE, STATUS ENGINE
       FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME LIKE 'innodb_system' \G
*************************** 1\. row ***************************
        FILE_ID: 0
      FILE_NAME: ./ibdata1
      FILE_TYPE: TABLESPACE
TABLESPACE_NAME: innodb_system
   FREE_EXTENTS: 0
  TOTAL_EXTENTS: 12
    EXTENT_SIZE: 1048576
   INITIAL_SIZE: 12582912
   MAXIMUM_SIZE: NULL
AUTOEXTEND_SIZE: 67108864
      DATA_FREE: 4194304
         ENGINE: NORMAL

此查询检索InnoDB文件表和一般表空间的FILE_ID(相当于空间 ID)和FILE_NAME(包括路径信息)。文件表和一般表空间的文件扩展名为.ibd

mysql> SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILES
       WHERE FILE_NAME LIKE '%.ibd%' ORDER BY FILE_ID;
 +---------+---------------------------------------+
 | FILE_ID | FILE_NAME                             |
 +---------+---------------------------------------+
 |       2 | ./mysql/plugin.ibd                    |
 |       3 | ./mysql/servers.ibd                   |
 |       4 | ./mysql/help_topic.ibd                |
 |       5 | ./mysql/help_category.ibd             |
 |       6 | ./mysql/help_relation.ibd             |
 |       7 | ./mysql/help_keyword.ibd              |
 |       8 | ./mysql/time_zone_name.ibd            |
 |       9 | ./mysql/time_zone.ibd                 |
 |      10 | ./mysql/time_zone_transition.ibd      |
 |      11 | ./mysql/time_zone_transition_type.ibd |
 |      12 | ./mysql/time_zone_leap_second.ibd     |
 |      13 | ./mysql/innodb_table_stats.ibd        |
 |      14 | ./mysql/innodb_index_stats.ibd        |
 |      15 | ./mysql/slave_relay_log_info.ibd      |
 |      16 | ./mysql/slave_master_info.ibd         |
 |      17 | ./mysql/slave_worker_info.ibd         |
 |      18 | ./mysql/gtid_executed.ibd             |
 |      19 | ./mysql/server_cost.ibd               |
 |      20 | ./mysql/engine_cost.ibd               |
 |      21 | ./sys/sys_config.ibd                  |
 |      23 | ./test/t1.ibd                         |
 |      26 | /home/user/test/test/t2.ibd           |
 +---------+---------------------------------------+

此查询检索InnoDB全局临时表空间的FILE_IDFILE_NAME。全局临时表空间文件名以ibtmp为前缀。

mysql> SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILES
       WHERE FILE_NAME LIKE '%ibtmp%';
+---------+-----------+
| FILE_ID | FILE_NAME |
+---------+-----------+
|      22 | ./ibtmp1  |
+---------+-----------+

同样,InnoDB撤销表空间文件名以undo为前缀。以下查询返回InnoDB撤销表空间的FILE_IDFILE_NAME

mysql> SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILES
       WHERE FILE_NAME LIKE '%undo%';

17.16 InnoDB 与 MySQL Performance Schema 的集成

原文:dev.mysql.com/doc/refman/8.0/en/innodb-performance-schema.html

17.16.1 使用 Performance Schema 监控 InnoDB 表的 ALTER TABLE 进度

17.16.2 使用 Performance Schema 监控 InnoDB 互斥等待

本节简要介绍了 InnoDB 与 Performance Schema 的集成。有关全面的 Performance Schema 文档,请参阅 第二十九章,MySQL Performance Schema

您可以使用 MySQL Performance Schema 功能 对某些内部 InnoDB 操作进行分析。这种调优主要面向专家用户,他们评估优化策略以克服性能瓶颈。数据库管理员也可以使用此功能进行容量规划,以查看其典型工作负载是否遇到特定 CPU、RAM 和磁盘存储组合的性能瓶颈;如果是,可以判断是否通过增加系统某部分的容量来改善性能。

要使用此功能检查 InnoDB 性能:

  • 您必须对如何使用 Performance Schema 功能 有一般了解。例如,您应该知道如何启用仪器和消费者,以及如何查询 performance_schema 表以检索数据。有关简介概述,请参阅 第 29.1 节,“Performance Schema 快速入门”。

  • 您应该熟悉可用于 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 实例表,这些表提供有关已仪器化对象的其他信息。与 InnoDB 相关的实例表包括:

    • mutex_instances

    • rwlock_instances

    • cond_instances

    • file_instances

    注意

    InnoDB缓冲池相关的互斥锁和读写锁不包括在此范围内;相同的情况也适用于SHOW ENGINE INNODB MUTEX命令的输出。

    例如,要查看执行文件 I/O 仪表化时性能模式看到的InnoDB文件对象的信息,您可以发出以下查询:

    mysql> SELECT *
           FROM performance_schema.file_instances
           WHERE EVENT_NAME LIKE '%innodb%'\G
    *************************** 1\. row ***************************
     FILE_NAME: /home/dtprice/mysql-8.0/data/ibdata1
    EVENT_NAME: wait/io/file/innodb/innodb_data_file
    OPEN_COUNT: 3
    *************************** 2\. row ***************************
     FILE_NAME: /home/dtprice/mysql-8.0/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.0/data/#ib_16384_1.dblwr
    EVENT_NAME: wait/io/file/mysql-8.0/innodb_dblwr_file
    OPEN_COUNT: 2
    ...
    
  • 您应该熟悉存储InnoDB事件数据的performance_schema表。与InnoDB相关事件相关的表包括:

    • 等待事件 表,存储等待事件。

    • 摘要 表,为随时间终止的事件提供聚合信息。摘要表包括 file I/O 摘要表,其中聚合了有关 I/O 操作的信息。

    • 阶段事件 表,存储了InnoDBALTER TABLE和缓冲池加载操作的事件数据。更多信息,请参阅 17.16.1 节,“使用性能模式监控 InnoDB 表的 ALTER TABLE 进度”,以及使用性能模式监控缓冲池加载进度。

    如果您只对与InnoDB相关的对象感兴趣,在查询这些表时,请使用子句WHERE EVENT_NAME LIKE '%innodb%'WHERE NAME LIKE '%innodb%'(根据需要)。