文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  优化 Performance Schema 查询

10.2.4 优化 Performance Schema 查询

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

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

要查看给定的 Performance Schema 表是否有索引以及它们是什么,请使用 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

要查看 Performance Schema 查询的执行计划以及它是否使用任何索引,请使用 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 输出表明优化器使用 accountsACCOUNT 索引,该索引包含 USERHOST 列。

Performance Schema 索引是虚拟的:它们是 Performance Schema 存储引擎的构造,不使用任何内存或磁盘存储。Performance Schema 向优化器报告索引信息,以便优化器可以构建有效的执行计划。Performance Schema 反过来使用关于要查找内容的优化器信息(例如,特定键值),以便它可以在不构建实际索引结构的情况下执行有效查找。这种实现提供了两个重要的好处

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

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

Performance Schema 索引是预定义的,不能删除、添加或修改。

Performance Schema 索引类似于哈希索引。例如

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

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

有关哈希索引的更多信息,请参见 第 10.3.9 节,“B 树索引和哈希索引的比较”.