Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Optimizing Performance Schema Queries

10.2.4 性能模式查询优化

监控数据库的应用程序可能会频繁地使用性能模式表。要高效地编写这些表的查询,利用它们的索引。例如,包括一个 WHERE 子句,该子句根据特定值在索引列中进行比较,限制检索的行数。

大多数性能模式表都有索引。那些没有索引的表通常包含少量行或不太可能被频繁查询。性能模式索引为优化器提供了除了全表扫描以外的执行计划。这些索引还可以改善相关对象的性能,如 sys 模式视图,它们使用这些表。

要查看给定的性能模式表是否有索引以及它们是什么,使用 SHOW INDEXSHOW 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 输出表明优化器使用了 accounts 表的 ACCOUNT 索引,该索引由 USERHOST 列组成。

性能模式索引是虚拟的:它们是性能模式存储引擎的构造,并且不占用内存或磁盘存储。性能模式报告索引信息给优化器,以便它可以构建高效的执行计划。性能模式然后使用优化器关于要查找什么的信息(例如,特定的键值),以便高效地执行查找,而不需要构建实际的索引结构。这实现了两个重要的优点:

  • 它完全避免了表经常更新时通常产生的维护成本。

  • 它在查询执行的早期阶段减少了检索的数据量。对于索引列的条件,性能模式高效地返回满足查询条件的表行。否则,性能模式将返回表中的所有行,然后优化器需要对每行进行条件评估以产生最终结果。

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

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

  • 它们仅用于使用 =<=> 运算符的相等比较。

  • 它们是无序的。如果查询结果必须具有特定的行排序特征,请包含一个 ORDER BY 子句。

有关哈希索引的更多信息,请参阅 第 10.3.9 节,“B-Tree 和哈希索引的比较”