### 8.2.4 优化性能模式查询

[](<>)[](<>)

监控数据库的应用程序可能会频繁使用性能模式表。要最有效地为这些表编写查询，请利用它们的索引。例如，包括一个`在哪里`根据与索引列中特定值的比较来限制检索的行的子句。

大多数性能模式表都有索引。不包含的表通常包含很少的行或不太可能被频繁查询。性能模式索引使优化器可以访问除全表扫描之外的执行计划。这些索引还提高了相关对象的性能，例如[`系统`](sys-schema.html)使用这些表的模式视图。

要查看给定的 Performance Schema 表是否具有索引以及它们是什么，请使用[`显示索引`](show-index.html)要么[`显示创建表`](show-create-table.html)：

```
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.html)：

```
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.html)输出表明优化器使用[`帐户`](performance-schema-accounts-table.html)桌子`帐户`指数包括`用户`和`主持人`列。

Performance Schema 索引是虚拟的：它们是 Performance Schema 存储引擎的构造，不使用内存或磁盘存储。Performance Schema 向优化器报告索引信息，以便它可以构建有效的执行计划。性能模式反过来使用关于要查找什么的优化器信息（例如，特定的键值），因此它可以在不构建实际索引结构的情况下执行有效的查找。这种实现提供了两个重要的好处：

-   它完全避免了频繁更新的表通常产生的维护成本。

-   它在查询执行的早期阶段减少了检索的数据量。对于索引列上的条件，Performance Schema 仅有效地返回满足查询条件的表行。如果没有索引，Performance Schema 将返回表中的所有行，这要求优化器稍后根据每一行评估条件以产生最终结果。

    性能模式索引是预定义的，不能删除、添加或更改。

    性能模式索引类似于哈希索引。例如：

-   它们仅用于使用`=`要么`<=>`运营商。

-   它们是无序的。如果查询结果必须具有特定的行排序特征，请包括`订购方式`条款。

    有关哈希索引的更多信息，请参阅[第 8.3.9 节，“B 树和哈希索引的比较”](index-btree-hash.html).
