MySQL8 中文参考(七十三)
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_CMP和INNODB_CMP_RESET提供有关压缩操作次数和执行压缩所花费时间的信息。 -
INNODB_CMPMEM和INNODB_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_CMP 和 INNODB_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_CMPMEM和INNODB_CMPMEM_RESET表提供有关位于缓冲池中的压缩页面的状态信息。请参阅第 17.9 节,“InnoDB 表和页面压缩”以获取有关压缩表和缓冲池使用的更多信息。INNODB_CMP和INNODB_CMP_RESET表应提供有关压缩的更有用的统计信息。
内部细节
InnoDB 使用一个 buddy allocator 系统来管理分配给各种大小的页面的内存,从 1KB 到 16KB。这里描述的两个表的每一行对应一个单独的页面大小。
INNODB_CMPMEM和INNODB_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_CMP,INNODB_CMP_PER_INDEX和INNODB_CMPMEM)。
以下表格显示了在轻量级工作负载下INFORMATION_SCHEMA.INNODB_CMP的内容。缓冲池中唯一包含的压缩页大小为 8K。自统计数据重置以来,压缩或解压页的时间不到一秒,因为COMPRESS_TIME和UNCOMPRESS_TIME列的值为零。
| 页大小 | 压缩操作 | 压缩操作成功 | 压缩时间 | 解压操作 | 解压时间 |
|---|---|---|---|---|---|
| 1024 | 0 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 0 | 0 | 0 | 0 |
| 4096 | 0 | 0 | 0 | 0 | 0 |
| 8192 | 1048 | 921 | 0 | 61 | 0 |
| 16384 | 0 | 0 | 0 | 0 | 0 |
根据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)。
| 页大小 | 已使用页数 | 空闲页数 | 重定位操作 | 重定位时间 |
|---|---|---|---|---|
| 64 | 5910 | 0 | 2436 | 0 |
| 128 | 0 | 1 | 0 | 0 |
| 256 | 0 | 0 | 0 | 0 |
| 512 | 0 | 1 | 0 | 0 |
| 1024 | 0 | 0 | 0 | 0 |
| 2048 | 0 | 1 | 0 | 0 |
| 4096 | 0 | 1 | 0 | 0 |
| 8192 | 6169 | 0 | 5 | 0 |
| 16384 | 0 | 0 | 0 | 0 |
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_locks 和 data_lock_waits 表公开的锁定信息,这些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKS 和 INNODB_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_STATE为RUNNING,LOCK WAIT,ROLLING BACK或COMMITTING)。 -
每个在 InnoDB 中等待另一个事务释放锁的事务(
INNODB_TRX.TRX_STATE为LOCK 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_locks和data_lock_waits表公开的锁定信息,这些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA中的INNODB_LOCKS和INNODB_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 | 阻塞线程 | 阻塞查询 |
|---|---|---|---|---|---|
A4 | 6 | SELECT b FROM t FOR UPDATE | A3 | 5 | SELECT SLEEP(100) |
A5 | 7 | SELECT c FROM t FOR UPDATE | A3 | 5 | SELECT SLEEP(100) |
A5 | 7 | SELECT c FROM t FOR UPDATE | A4 | 6 | SELECT b FROM t FOR UPDATE |
在上表中,您可以通过“等待查询”或“阻塞查询”列来识别会话。正如您所看到的:
-
会话 B(trx id
A4,线程6)和会话 C(trx idA5,线程7)都在等待会话 A(trx idA3,线程5)。 -
会话 C 正在等待会话 B 以及会话 A。
你可以在INFORMATION_SCHEMA的INNODB_TRX表以及性能模式的data_locks和data_lock_waits表中查看底层数据。
以下表格显示了INNODB_TRX表的一些示例内容。
| 事务 ID | 事务状态 | 事务开始时间 | 请求锁 ID | 等待开始时间 | 权重 | MySQL 线程 ID | 查询语句 |
|---|---|---|---|---|---|---|---|
A3 | RUNNING | 2008-01-15 16:44:54 | NULL | NULL | 2 | 5 | SELECT SLEEP(100) |
A4 | LOCK WAIT | 2008-01-15 16:45:09 | A4:1:3:2 | 2008-01-15 16:45:09 | 2 | 6 | SELECT b FROM t FOR UPDATE |
A5 | LOCK WAIT | 2008-01-15 16:45:14 | A5:1:3:2 | 2008-01-15 16:45:14 | 2 | 7 | SELECT c FROM t FOR UPDATE |
以下表格显示了data_locks表的一些示例内容。
| 锁 ID | 锁事务 ID | 锁模式 | 锁类型 | 锁模式 | 锁表 | 锁索引 | 锁数据 |
|---|---|---|---|---|---|---|---|
A3:1:3:2 | A3 | X | RECORD | test | t | PRIMARY | 0x0200 |
A4:1:3:2 | A4 | X | RECORD | test | t | PRIMARY | 0x0200 |
A5:1:3:2 | A5 | X | RECORD | test | t | PRIMARY | 0x0200 |
以下表格显示了data_lock_waits表的一些示例内容。
| 请求事务 ID | 请求锁 ID | 阻塞事务 ID | 阻塞锁 ID |
|---|---|---|---|
A4 | A4:1:3:2 | A3 | A3:1:3:2 |
A5 | A5:1:3:2 | A3 | A3:1:3:2 |
A5 | A5:1:3:2 | A4 | A4:1:3:2 |
在发出会话变为空闲后识别阻塞查询
在识别阻塞事务时,如果发出查询的会话已经变为空闲,则会报告阻塞查询的 NULL 值。在这种情况下,使用以下步骤确定阻塞查询:
-
确定阻塞事务的进程列表 ID。在
sys.innodb_lock_waits表中,阻塞事务的进程列表 ID 是blocking_pid值。 -
使用
blocking_pid,查询 MySQL 性能模式的threads表以确定阻塞事务的THREAD_ID。例如,如果blocking_pid为 6,则发出以下查询:SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6; -
使用
THREAD_ID,查询性能模式events_statements_current表以确定线程执行的最后一个查询。例如,如果THREAD_ID为 28,则发出此查询:SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current WHERE THREAD_ID = 28\G -
如果线程执行的最后一个查询不足以确定为何保持锁定,则可以查询性能模式
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_locks和data_lock_waits表的输出来自一个负载较重的系统。可以看到,有几个事务正在运行。
下面的data_locks和data_lock_waits表显示:
- 事务
77F(执行INSERT和INNODB_TRX表中显示的查询可能存在不一致。有关解释,请参见 第 17.15.2.3 节,“InnoDB 事务和锁定信息的持久性和一致性”。
以下表格显示了运行重 工作负载 系统的 PROCESSLIST 表的内容。
| ID | 用户 | 主机 | 数据库 | 命令 | 时间 | 状态 | 信息 |
|---|---|---|---|---|---|---|---|
384 | root | localhost | test | Query | 10 | update | INSERT INTO t2 VALUES … |
257 | root | localhost | test | Query | 3 | update | INSERT INTO t2 VALUES … |
130 | root | localhost | test | Query | 0 | update | INSERT INTO t2 VALUES … |
61 | root | localhost | test | Query | 1 | update | INSERT INTO t2 VALUES … |
8 | root | localhost | test | Query | 1 | update | INSERT INTO t2 VALUES … |
4 | root | localhost | test | Query | 0 | preparing | SELECT * FROM PROCESSLIST |
2 | root | localhost | test | Sleep | 566 | NULL |
以下表格显示了运行重 工作负载 系统的 INNODB_TRX 表的内容。
| 事务 ID | 事务状态 | 事务开始时间 | 事务请求锁 ID | 事务等待开始时间 | 事务权重 | 事务 MySQL 线程 ID | 事务查询 |
|---|---|---|---|---|---|---|---|
77F | LOCK WAIT | 2008-01-15 13:10:16 | 77F | 2008-01-15 13:10:16 | 1 | 876 | INSERT INTO t09 (D, B, C) VALUES … |
77E | LOCK WAIT | 2008-01-15 13:10:16 | 77E | 2008-01-15 13:10:16 | 1 | 875 | INSERT INTO t09 (D, B, C) VALUES … |
77D | LOCK WAIT | 2008-01-15 13:10:16 | 77D | 2008-01-15 13:10:16 | 1 | 874 | INSERT INTO t09 (D, B, C) VALUES … |
77B | LOCK WAIT | 2008-01-15 13:10:16 | 77B:733:12:1 | 2008-01-15 13:10:16 | 4 | 873 | INSERT INTO t09 (D, B, C) VALUES … |
77A | RUNNING | 2008-01-15 13:10:16 | NULL | NULL | 4 | 872 | SELECT b, c FROM t09 WHERE … |
E56 | LOCK WAIT | 2008-01-15 13:10:06 | E56:743:6:2 | 2008-01-15 13:10:06 | 5 | 384 | INSERT INTO t2 VALUES … |
E55 | LOCK WAIT | 2008-01-15 13:10:06 | E55:743:38:2 | 2008-01-15 13:10:13 | 965 | 257 | INSERT INTO t2 VALUES … |
19C | RUNNING | 2008-01-15 13:09:10 | NULL | NULL | 2900 | 130 | INSERT INTO t2 VALUES … |
E15 | 运行中 | 2008-01-15 13:08:59 | NULL | NULL | 5395 | 61 | INSERT INTO t2 VALUES … |
51D | 运行中 | 2008-01-15 13:08:47 | NULL | NULL | 9807 | 8 | INSERT INTO t2 VALUES … |
| 事务标识 | 事务状态 | 事务开始时间 | 事务请求的锁标识 | 事务等待开始时间 | 事务权重 | 事务 MySQL 线程标识 | 事务查询 |
下表显示了运行重 工作负载 系统的 data_lock_waits 表的内容。
| 请求事务标识 | 请求的锁标识 | 阻塞事务标识 | 阻塞的锁标识 |
|---|---|---|---|
77F | 77F:806 | 77E | 77E:806 |
77F | 77F:806 | 77D | 77D:806 |
77F | 77F:806 | 77B | 77B:806 |
77E | 77E:806 | 77D | 77D:806 |
77E | 77E:806 | 77B | 77B:806 |
77D | 77D:806 | 77B | 77B:806 |
77B | 77B:733:12:1 | 77A | 77A:733:12:1 |
E56 | E56:743:6:2 | E55 | E55:743:6:2 |
E55 | E55:743:38:2 | 19C | 19C:743:38:2 |
下表显示了运行重 工作负载 系统的 data_locks 表的内容。
| 锁标识 | 锁事务标识 | 锁模式 | 锁类型 | 锁模式 | 锁表 | 锁索引 | 锁数据 |
|---|---|---|---|---|---|---|---|
77F:806 | 77F | AUTO_INC | TABLE | test | t09 | NULL | NULL |
77E:806 | 77E | AUTO_INC | TABLE | test | t09 | NULL | NULL |
77D:806 | 77D | AUTO_INC | TABLE | test | t09 | NULL | NULL |
77B:806 | 77B | AUTO_INC | TABLE | test | t09 | NULL | NULL |
77B:733:12:1 | 77B | X | RECORD | test | t09 | PRIMARY | supremum pseudo-record |
77A:733:12:1 | 77A | X | RECORD | test | t09 | PRIMARY | supremum pseudo-record |
E56:743:6:2 | E56 | S | RECORD | test | t2 | PRIMARY | 0, 0 |
E55:743:6:2 | E55 | X | RECORD | test | t2 | PRIMARY | 0, 0 |
E55:743:38:2 | E55 | S | RECORD | test | t2 | PRIMARY | 1922, 1922 |
19C:743:38:2 | 19C | X | RECORD | test | t2 | PRIMARY | 1922, 1922 |
| 锁标识 | 锁事务标识 | 锁模式 | 锁类型 | 锁模式 | 锁表 | 锁索引 | 锁数据 |
原文:
dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-understanding-innodb-locking.html
17.15.2.2 InnoDB 锁和锁等待信息
注意
本节描述了由 Performance Schema data_locks 和 data_lock_waits 表公开的锁信息,它们在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKS 和 INNODB_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_locks 和 data_lock_waits 表公开的锁信息,这些表在 MySQL 8.0 中取代了 INFORMATION_SCHEMA INNODB_LOCKS 和 INNODB_LOCK_WAITS 表。有关以旧的 INFORMATION_SCHEMA 表为基础的类似讨论,请参阅 InnoDB 事务和锁信息的持久性和一致性,在 MySQL 5.7 参考手册 中。
事务和锁定表(INFORMATION_SCHEMA INNODB_TRX 表,性能模式 data_locks 和 data_lock_waits 表)公开的数据代表了对快速变化数据的一瞥。这不像用户表,其中数据仅在应用程序发起的更新发生时才会更改。底层数据是内部系统管理的数据,可以非常快速地更改:
-
INNODB_TRX、data_locks和data_lock_waits表之间的数据可能不一致。data_locks和data_lock_waits表公开了来自InnoDB存储引擎的实时数据,提供有关INNODB_TRX表中事务的锁信息。从锁表中检索的数据存在于执行SELECT时,但在查询结果被客户端消耗时可能已经消失或更改。将
data_locks与data_lock_waits连接可以显示在data_lock_waits中标识不再存在或尚不存在的data_locks中的父行的行。 -
事务和锁定表中的数据可能与
INFORMATION_SCHEMAPROCESSLIST表或性能模式threads表中的数据不一致。例如,当比较
InnoDB事务和锁定表中的数据与PROCESSLIST表中的数据时,应该小心。即使您发出单个SELECT(例如连接INNODB_TRX和PROCESSLIST),这些表的内容通常不一致。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_ID、INDEX_ID和SPACE等字段进行连接,使您可以轻松检索要研究或监视的对象的所有可用数据。
参考InnoDB INFORMATION_SCHEMA 文档,了解每个表的列信息。
示例 17.2 InnoDB INFORMATION_SCHEMA 模式对象表
本示例使用一个简单的表(t1)和一个单一索引(i1)来演示在InnoDB INFORMATION_SCHEMA模式对象表中找到的元数据类型。
-
创建一个测试数据库和表
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); -
创建表
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表
t1的TABLE_ID为 71。FLAG字段提供有关表格式和存储特性的位级信息。共有六列,其中三列是由InnoDB创建的隐藏列(DB_ROW_ID、DB_TRX_ID和DB_ROLL_PTR)。表的SPACE的 ID 为 57(值为 0 表示表位于系统表空间中)。ROW_FORMAT为 Compact。ZIP_PAGE_SIZE仅适用于具有Compressed行格式的表。INSTANT_COLS显示在使用ALTER TABLE ... ADD COLUMN添加第一个即时列之前表中的列数。 -
使用
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_DEFAULT和DEFAULT_VALUE列仅适用于使用ALTER TABLE ... ADD COLUMN立即添加的列。 -
再次使用
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: 50INNODB_INDEXES返回两个索引的数据。第一个索引是GEN_CLUST_INDEX,如果表没有用户定义的聚簇索引,则InnoDB会创建一个聚簇索引。第二个索引(i1)是用户定义的二级索引。INDEX_ID是一个在实例中所有数据库中唯一的索引标识符。TABLE_ID标识与索引关联的表。索引TYPE值表示索引类型(1 = 聚簇索引,0 = 二级索引)。N_FILEDS值是组成索引的字段数。PAGE_NO是索引 B 树的根页号,SPACE是索引所在的表空间的 ID。非零值表示索引不位于系统表空间中。MERGE_THRESHOLD定义了索引页中数据量的百分比阈值。如果索引页中的数据量低于此值(默认为 50%),当删除行或通过更新操作缩短行时,InnoDB会尝试将索引页与相邻的索引页合并。 -
使用
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: 0INNODB_FIELDS提供索引字段的NAME和其在索引中的序号位置。如果索引(i1)是在多个字段上定义的,INNODB_FIELDS将为每个索引字段提供元数据。 -
使用
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除了表空间的
SPACEID 和关联表的NAME之外,INNODB_TABLESPACES提供表空间FLAG数据,这是关于表空间格式和存储特性的位级信息。还提供了表空间ROW_FORMAT,PAGE_SIZE以及其他几个表空间元数据项。 -
再次使用
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将是一个完全限定的目录路径。 -
最后一步,向表
t1(TABLE_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: 1STATS_INITIALIZED字段指示表是否已收集统计信息。NUM_ROWS是表中当前估计的行数。CLUST_INDEX_SIZE和OTHER_INDEX_SIZE字段分别报告存储表的聚集索引和辅助索引的磁盘上的页面数。MODIFIED_COUNTER值显示被 DML 操作和外键级联操作修改的行数。AUTOINC值是任何自增操作即将发行的下一个数字。在表t1上没有定义自增列,因此该值为 0。REF_COUNT值是一个计数器。当计数器达到 0 时,表示表元数据可以从表缓存中驱逐。
示例 17.3 外键 INFORMATION_SCHEMA 模式对象表
INNODB_FOREIGN和INNODB_FOREIGN_COLS表提供有关外键关系的数据。此示例使用具有外键关系的父表和子表来演示在INNODB_FOREIGN和INNODB_FOREIGN_COLS表中找到的数据。
-
创建具有父表和子表的测试数据库:
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; -
创建父表和子表后,查询
INNODB_FOREIGN并找到test/child和test/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元数据包括外键
ID(fk1),该外键是在子表上定义的CONSTRAINT的名称。FOR_NAME是定义外键的子表的名称。REF_NAME是父表(“被引用”表)的名称。N_COLS是外键索引中的列数。TYPE是表示有关外键列的其他信息的位标志的数值。在这种情况下,TYPE值为 1,表示为外键指定了ON DELETE CASCADE选项。有关TYPE值的更多信息,请参阅INNODB_FOREIGN表定义。 -
使用外键
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: 0FOR_COL_NAME是子表中外键列的名称,REF_COL_NAME是父表中引用列的名称。POS值是外键索引中键字段的序数位置,从零开始。
示例 17.4 连接 InnoDB INFORMATION_SCHEMA 模式对象表
此示例演示了连接三个InnoDB INFORMATION_SCHEMA模式对象表(INNODB_TABLES、INNODB_TABLESPACES和INNODB_TABLESTATS)以收集有关员工示例数据库中表的文件格式、行格式、页面大小和索引大小信息。
以下表别名用于缩短查询字符串:
-
INFORMATION_SCHEMA.INNODB_TABLES:a -
INFORMATION_SCHEMA.INNODB_TABLESPACES:b -
INFORMATION_SCHEMA.INNODB_TABLESTATS:c
使用IF()控制流函数来处理压缩表。如果表被压缩,索引大小将使用ZIP_PAGE_SIZE而不是PAGE_SIZE来计算。CLUST_INDEX_SIZE和OTHER_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索引中删除的行。为了避免在InnoDBFULLTEXT索引的 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_size或innodb_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表中包含的数据。
-
创建一个具有
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 ...'); -
将
innodb_ft_aux_table变量设置为具有FULLTEXT索引的表的名称。如果未设置此变量,则InnoDBFULLTEXTINFORMATION_SCHEMA表为空,除了INNODB_FT_DEFAULT_STOPWORD。mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles'; -
查询
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 | +------------+--------------+-------------+-----------+--------+----------+ -
启用
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 | +---------------+----------+----------+----------+ -
查询
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) -
从
test/articles表中删除一些记录。mysql> DELETE FROM test.articles WHERE id < 4; -
查询
INNODB_FT_DELETED表。该表记录从FULLTEXT索引中删除的行。为了避免在 DML 操作期间进行昂贵的索引重组,新删除记录的信息被单独存储,当进行文本搜索时从搜索结果中过滤掉,并在运行OPTIMIZE TABLE时从主搜索索引中删除。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; +--------+ | DOC_ID | +--------+ | 2 | | 3 | | 4 | +--------+ -
运行
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) -
查询
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 | +---------------------------+-------+ -
-
禁用
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_PAGE或INNODB_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 NULL 且 NOT 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 STATUS 和 InnoDB 缓冲池状态变量的信息。
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_opened 和 metadata_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_disable 和 innodb_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 表中查询计数器数据。
-
创建一个简单的
InnoDB表:mysql> USE test; Database changed mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB; Query OK, 0 rows affected (0.02 sec) -
启用
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 | +-------------+-------------------------+ -
查询
dml_inserts计数器数据的INNODB_METRICS表。因为没有执行 DML 操作,计数器值为零或 NULL。TIME_ENABLED和TIME_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 -
向表中插入三行数据。
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) -
再次查询
INNODB_METRICS表以获取dml_inserts计数器数据。现在已经增加了许多计数器值,包括COUNT、MAX_COUNT、AVG_COUNT和COUNT_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 -
重置
dml_inserts计数器,并再次查询INNODB_METRICS表以获取dml_inserts计数器数据。先前报告的%_RESET值,如COUNT_RESET和MAX_RESET,将被设置为零。像COUNT、MAX_COUNT和AVG_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 -
要重置所有计数器值,必须先禁用计数器。禁用计数器会将
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_开头的计数器。 -
在禁用计数器后,可以使用
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表的特性。
-
创建一个简单的
InnoDB临时表:mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; -
查询
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: 182TABLE_ID是临时表的唯一标识符。NAME列显示临时表的系统生成名称,前缀为“#sql”。列数(N_COLS)为 4,而不是 1,因为InnoDB始终创建三个隐藏表列(DB_ROW_ID、DB_TRX_ID和DB_ROLL_PTR)。 -
重启 MySQL 并查询
INNODB_TEMP_TABLE_INFO。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G返回一个空集,因为当服务器关闭时,
INNODB_TEMP_TABLE_INFO及其数据不会持久保存到磁盘。 -
创建一个新的临时表。
mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; -
查询
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: 184SPACEID 可能不同,因为它在服务器启动时动态生成。
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_TABLESPACES和INNODB_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_ID和FILE_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_ID和FILE_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 操作的信息。
-
阶段事件 表,存储了
InnoDB的ALTER TABLE和缓冲池加载操作的事件数据。更多信息,请参阅 17.16.1 节,“使用性能模式监控 InnoDB 表的 ALTER TABLE 进度”,以及使用性能模式监控缓冲池加载进度。
如果您只对与
InnoDB相关的对象感兴趣,在查询这些表时,请使用子句WHERE EVENT_NAME LIKE '%innodb%'或WHERE NAME LIKE '%innodb%'(根据需要)。 -