Skip to main content

31.优化 Performance Schema 查询

监视数据库的应用程序可能会频繁使用性能模式(Performance Schema)表。 要最有效地为这些表编写查询,请利用它们的索引。 例如,包含一个 WHERE 子句,该子句根据与索引列中特定值的比较来限制检索的行。

大多数性能模式表都有索引。 不存在的表通常包含很少的行或不太可能被频繁查询。 性能模式索引使优化器可以访问除全表扫描之外的执行计划。 这些索引还可以提高相关对象的性能,例如使用这些表的 sys 架构视图。

要查看给定的性能模式表是否有索引以及它们是什么,请使用 SHOW INDEX 或 SHOW CREATE TABLE:

mysql> SHOW INDEX FROM performance_schema.accounts\G
*************************** 1. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 1
Column_name: USER
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES
*************************** 2. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 2
Column_name: HOST
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES

mysql> SHOW CREATE TABLE performance_schema.rwlock_instances\G
*************************** 1. row ***************************
Table: rwlock_instances
Create Table: CREATE TABLE `rwlock_instances` (
`NAME` varchar(128) NOT NULL,
`OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
`WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
`READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL,
PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
KEY `NAME` (`NAME`),
KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

要查看性能模式查询的执行计划以及它是否使用任何索引,请使用 EXPLAIN:

mysql> EXPLAIN SELECT * FROM performance_schema.accounts
WHERE (USER,HOST) = ('root','localhost')\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: accounts
partitions: NULL
type: const
possible_keys: ACCOUNT
key: ACCOUNT
key_len: 278
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL

EXPLAIN 输出表明优化器使用包含 USER 和 HOST 列的帐户表 ACCOUNT 索引。

性能模式索引是虚拟的:它们是性能模式存储引擎的构造,不使用内存或磁盘存储。 Performance Schema 向优化器报告索引信息,以便优化器构建高效的执行计划。 性能模式反过来使用有关要查找的内容(例如,特定键值)的优化器信息,以便它可以执行有效的查找,而无需构建实际的索引结构。 此实施提供了两个重要的好处:

  • 它完全避免了频繁更新的表通常产生的维护成本。
  • 它减少了查询执行早期阶段检索的数据量。 对于索引列上的条件,性能模式有效地仅返回满足查询条件的表行。 如果没有索引,性能模式将返回表中的所有行,要求优化器稍后针对每行评估条件以生成最终结果。

性能架构索引是预定义的,不能删除、添加或更改。

性能模式索引与哈希索引类似。 例如:

  • 它们仅用于使用 =<=> 运算符的相等比较。
  • 它们是无序的。 如果查询结果必须具有特定的行排序特征,请包含 ORDER BY 子句。